2013-03-13 81 views
-3

三表需要优化查询其需要的数据,从三个表

accounts, products, users 
  1. 选择用户ID和电子邮件从用户表那里ID在 占
  2. 然后从产品表,其中筛选出来用户 买了3件以上的商品 (需要统计产品表中的用户数量,如果用户数量超过3,则排除用户)。

    SELECT id, email 
    FROM users 
    WHERE id 
    IN (
    SELECT user_id 
    FROM accounts 
    WHERE users.id = user_id 
    ) 
    

我把所有的用户ID和电子邮件,但现在我需要将它们从产品表中过滤掉。在产品表中,我有'product_id'和'leader_id',这是用户ID。

我需要优化的查询,因为表非常大

+1

没有足够的信息。我们不知道这些表格是如何相关的。我们不知道表中是否存在任何索引来提高性能,我们不知道您尝试了什么。 – xQbert 2013-03-13 12:23:58

+0

确实....向我们展示了一些示例数据或您的表格结构;) – Hackerman 2013-03-13 12:25:00

+1

@javier这是一个非常大的飞跃。假设每个表都有一个名为ID的字段,我推断它的意思是它们的主键,可能是Account_ID,Product_ID,User_ID或可能只是'ID',这个含糊性就是我问的原因。 – xQbert 2013-03-13 12:28:06

回答

1

我有点明白了......这样的事情应该工作:

select u.id,u.mail, 
(select count(1) 
    from products 
    where products.leader_id = u.id) 
as conteo 
from user u 
    left join account ac 
on(u.id = ac.user_id) 
having (conteo>3) 

我希望它能帮助;)

Saludos。

1

如果您需要一个优化的查询,请提供适当的架构细节 - 表,数据类型和索引。

SELECT id, email 
    FROM users 
    WHERE id 
    IN (
     SELECT user_id 
     FROM accounts 
     WHERE users.id = user_id 
    ) 

绝对不要使用子查询,除非你绝对必须。既然你不想要帐户表中的任何数据,在大多数数据库管理系统中,'EXISTS(SELECT 1 FROM accounts WHERE users.id = user_id)'的效率会更高 - 但在MySQL中不会优化很好地推动谓词。

查询应该是:

SELECT DISTINCT u.id, u.email 
FROM users u INNER JOIN accounts a 
ON u.id=a.user_id; 
从产品表,其中用户购买了超过3个产品

虽然我可以猜到足够的架构的重新编写之前的查询

出来,我不知道产品表是如何构建的,事实上,'产品'暗示着一个项目的目录,并且与帐户的关系似乎是一个n:m,这意味着必须有一个分解关系的缺失表。此外,根据您的描述,账户数据与“产品”表格数据无关(似乎很奇怪)。你想包括用户在“产品”中没有相关记录的情况吗?

假设这是不是这种情况,并且在猜测什么结构可能....

SELECT u.id, u.email, SUM(IF(leader_id IS NULL, 0, amount)) 
FROM users u INNER JOIN accounts a 
ON u.id=a.user_id 
LEFT JOIN product p 
ON u.id=p.leader_id 
GROUP BY u.id, u.email; 

我需要优化的查询,因为表非常大

为什么你需要在单个查询中查看所有数据吗?

+0

好的查询,但用户不排除那些购买超过3倍。 id列在leader_id列中的产品中。我需要排除购买产品超过3次的所有用户 – Akaash 2013-03-13 13:17:30

+0

哎呀 - 在故事中有点失落 - 在末尾添加'HAVING SUM(IF(leader_id IS NULL,0,amount))<4'。 – symcbean 2013-03-13 13:33:03