[英]SQL IN query from multiple tables
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 )
有人知道第一個查詢有什么問題嗎? 幫助將不勝感激!
我認為小組選擇會使您的問題復雜化。 如果我理解正確,那么使用聯接而不是子選擇將更容易解決您的問題。
試試這樣的事情:
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
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
您要使用聯接。 您正在使用的子查詢很可能是造成性能問題的原因。
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
我猜您正在使用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
的替代方法也是可行的。 但是,它們要求與眾不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.