2012-12-03 146 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的替代方案也是可行的。然而,他們需要獨特的。