三张桌子
accounts, products, users
然后从用户的产品表中筛选出来 买了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。
我需要优化查询,因为表格非常大
答案 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;
我需要优化查询,因为表格非常大
为什么需要在单个查询中查看所有数据?