簡體   English   中英

mysql連接相同的表名和列名

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM