2012-12-03 111 views
0
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”来自多个表的SQL IN查询

以下查询运行得非常好!

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) 

任何机构都有一个想法第一个查询有什么问题。帮助将非常感谢!谢谢。

+1

你的意思是他们是这样嵌套的吗?这里的问题是嵌套的子查询需要为'user_group'中的每一行计算一次,而这又需要为'addresses'中的每一行计算一次。 –

+1

请改用'JOIN'来代替。 – cjk

+0

是的,我想执行该查询,语法是否正确?因为其他查询完全正确,因为我已检查结果。我已经尝试过JOIN,但是我不知道如何为2个以上的表写JOIN。 JOIN只与2个表一起工作吗? – user142397

回答

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 
+0

你好,汤姆!非常感谢你,你的查询工作。我现在很开心!你很棒!再次感谢。 – user142397

+0

我很高兴我能帮上忙。考虑给予赞成或将答案标记为有效,如果它对你有帮助。 – Tom

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 
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 
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的替代方案也是可行的。然而,他们需要独特的。