需要优化查询,从三个表中获取数据

时间:2013-03-13 12:21:22

标签: mysql query-optimization

三张桌子

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
    )
    
  3. 我获得了所有用户ID和电子邮件,但现在我需要从产品表中过滤掉它们。在产品表中,我有'product_id'和'leader_id',这是用户ID。

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

2 个答案:

答案 0 :(得分: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 :(得分: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)'在大多数DBMS中会更有效率 - 但在MySQL中并没有很好地优化推送谓词。

查询应该是:

SELECT DISTINCT u.id, u.email
FROM users u INNER JOIN accounts a 
ON u.id=a.user_id;
  

从用户购买超过3种产品的产品表中删除

虽然我可以猜到足够的架构来重新编写您之前的查询,但我不知道产品表是如何构建的,实际上,'产品'意味着一个项目目录,与账户的关系似乎是一个n:m暗示必须有一个丢失的表来分解这种关系。此外,根据您的描述,帐户数据独立于"产品"表数据(看起来很奇怪)。您是否希望包含用户在" product"?

中没有相关记录的情况

假设情况并非如此,并猜测结构可能是什么......

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;
  

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

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