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”的用户的电子邮件地址。

以下查询运行良好:

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

4 回答 4

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
于 2012-12-03T11:44:06.740 回答
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
于 2012-12-03T11:48:44.730 回答
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也是可行的。但是,它们需要不同的。

于 2012-12-03T14:22:25.727 回答
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
于 2012-12-03T11:43:54.023 回答