SELECT DISTINCT addresses.email FROM addresses
WHERE addresses.user_id IN (SELECT user_group.id_user_groups FROM user_group
WHERE id_group_groups IN (SELECT news_group.groupid_newsg FROM news_group
WHERE newsid_news_good=1))
上面提到的SQL查询没有执行!它会被挂起,直到我停止查询。我在第一个SELECT语句之后尝试过SQL运算符“UNION”,但是它显示了不属于某个组的所有电子邮件地址。我只想选择属于“id_group_groups = 5”的用户的电子邮件地址(请参阅下面的查询)并订阅“newsid_news_good = 1”。
以下查询运行完全正常:
SELECT DISTINCT addresses.email FROM addresses
WHERE addresses.user_id IN (SELECT user_group.id_user_groups FROM user_group
WHERE id_group_groups =5 )
有人知道第一个查询有什么问题吗?将非常感谢帮助!
答案 0 :(得分:1)
我认为子选择会使您的问题复杂化。如果我理解正确,使用连接而不是子选择来解决问题会更容易。
尝试这样的事情:
SELECT DISTINCT addresses.email
FROM addresses
JOIN user_group
ON user_group.id_user_groups = adresses.USER_ID
JOIN news_group
ON news_group.groupid_newsg = user_group.id_group_groups
WHERE newsid_news_good = 1
答案 1 :(得分:0)
SELECT DISTINCT addresses.email FROM addresses
INNER JOIN (
SELECT user_group.id_user_groups FROM user_group
INNER JOIN news_group
ON news_group.groupid_newsg = id_group_groups
WHERE newsid_news_good=1
)
ON user_group.id_user_groups = addresses.user_id
答案 2 :(得分:0)
您想使用联接。您正在使用的子查询很可能是导致性能问题的原因。
SELECT DISTINCT a.email
FROM addresses a
INNER JOIN user_group u ON u.id_user_groups AND u.id_group_groups = 5
INNER JOIN news_group n ON n.groupid_newsg = u.id_group_groups AND n.newsid_news_good = 1
答案 3 :(得分:0)
我猜你正在使用MySQL,因为它在联合中执行子查询的工作非常糟糕。修复此问题的规范方法是使用相关子查询将它们更改为exists
:
SELECT DISTINCT a.email
FROM addresses a
where exists (select 1
from user_group ug
where ug.id_user_groups = a.user_id and
exists (select 1
from news_group ng
where ng.newsid_news_good = 1 and
ng.groupid_news = ug.id_group_groups
)
)
当然,此解决方案适用于所有数据库;它在MySQL中效率更高。假设地址表中没有重复发送电子邮件,那么您可以删除外部不同。
join
的替代方案也是可行的。但是他们需要不同的。