[英]mysql join on same table and column names
我有一個表profile_data
,結構如下:
id, user_id, field_id, value
我需要為任何匹配多個zipcodes並且其國家/地區為美國的用戶獲取user_id。
到目前為止,我有這個不起作用的查詢:
SELECT data1.user_id
FROM profile_data data1, profile_data data2
WHERE data1.field_id = 80
AND ( value = '94114' OR value = '94146' OR value = '94117' )
AND data2.field_id = 90
AND value = 'United States'
嘗試這個
SELECT DISTINCT user_id
FROM profile_data data1
WHERE field_id = 80 AND value IN ('94114', '94146', '94117')
AND EXISTS (SELECT *
FROM profile_data
WHERE field_id = 90
AND value = 'United States'
AND user_id = data1.user_id)
假設您有一個配置文件和配置文件數據表,您可以執行此操作並避免使用不同的排序:
SELECT user_id
FROM profile
WHERE EXISTS (SELECT *
FROM profile_data
WHERE field_id = 80
AND value IN ('94114','94146','94117')
AND user_id = profile.user_id)
AND EXISTS (SELECT *
FROM profile_data
WHERE field_id = 90
AND value = 'United States'
AND user_id = profile.user_id)
編輯我根據Kris的解決方案/改進刪除了我的一個子查詢。
以下是我對您可能嘗試做的事情的看法:
SELECT user_id
FROM profile_data
WHERE (field_id = 80 AND value IN ('94114', '94146', '94117'))
OR (field_id = 90 AND value = 'United States')
編輯
對不起,我沒有意識到每個用戶可能有多行。 如果是這種情況,則上述操作無效。 上面答案中編輯的存在語句將是。 雖然您不需要同時執行這兩個子查詢:
SELECT user_id FROM profile_data p1
WHERE (field_id = 80 AND value IN ('94114', '94146', '94117'))
AND EXISTS (SELECT 1 FROM profile_data p2 WHERE field_id = 90 AND value = 'United States' AND p1.user_id = p2.user_id)
希望您的優化器無論如何都會將其減少到正確的連接數。
另外,郵政編碼是針對特定國家/地區的。 所以這個具體的例子是多余的,但是有很多有效的用例。
嘗試這個:
SELECT us_users.user_id
FROM
(
SELECT user_id
FROM profile_data
WHERE field_id = 90 AND value = 'United States'
) AS us_users
INNER JOIN (
SELECT user_id
FROM profile_data
WHERE field_id = 80 AND value IN ('94114','94146','94117')
) AS zipcodes
ON us_users.user_id = zipcodes.user_id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.