-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。

我需要优化查询,因为表很大

4

2 回答 2

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)

我希望它有帮助;)

萨卢多斯。

于 2013-03-13T12:48:48.433 回答
1

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

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

除非绝对必要,否则永远不要使用子查询。由于您不想要帐户表中的任何数据,因此在大多数 DBMS 中,“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;

我需要优化查询,因为表很大

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

于 2013-03-13T12:59:45.107 回答