如果您需要优化查询,请提供您的架构的适当详细信息 - 表、数据类型和索引。
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;
我需要优化查询,因为表很大
为什么需要在一个查询中查看所有数据?