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」(plsは以下のクエリを参照)に属し、「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 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 に答える
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を使用していると推測します。これは、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 に答える