来自多个表的SQL IN查询

时间:2012-12-03 11:37:54

标签: sql

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 )

有人知道第一个查询有什么问题吗?将非常感谢帮助!

4 个答案:

答案 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的替代方案也是可行的。但是他们需要不同的。