2012-08-30 43 views
0

在教程中,我看到這個SQL查詢:SQL - JOIN複雜查詢

SELECT a.id as a_id, a.info as a_info, 
     b.id as b_id, b.info as b_info 
FROM stats AS a 
JOIN stats as b 
ON a.id != b.id 
LIMIT 25 

查詢運作良好,但現在我需要添加WHERE條件。我有表users。表stats包含列user_id。 我嘗試從表stats如果users.city=1(例如)獲得所有用戶,但我仍然無法找到一種方法,如何實現這一目標?

我的問題是,我目前還沒有線索,如何在查詢中放入另一個JOIN(表users)。

我會爲每一個建議表示感謝,謝謝

+0

你想完成什麼?該查詢並非真正有用,或者看起來如此。 –

回答

1

那麼,你使用表stats兩次在你的查詢中,你實際上也需要兩個連接users表。 (對於統計A和統計B)

SELECT a.id as a_id, a.info as a_info, 
     b.id as b_id, b.info as b_info 
FROM stats AS a 
JOIN stats AS b ON a.id != b.id 
JOIN users AS a_users ON a.user_id = a_users.id 
JOIN users AS b_users ON b.user_id = b_users.id 
WHERE a_users.city = 1 
    OR b_users.city = 1 
LIMIT 25 
+0

謝謝!只是 - 'WHERE a_users.city = 1 或b_users.city = 1'爲什麼沒有'AND'? – user984621

+0

@ user984621如果您使用「AND」或「OR」取決於您想要選擇的數據集。 – Kaii

1

因此,這是你有什麼...

這是你回來什麼

SELECT a.id as a_id, a.info as a_info, b.id as b_id, b.info as b_info 

這是從何而來從

FROM stats AS a 
JOIN stats as b on a.id != b.id 

這是多少你想

LIMIT 25 

所以,如果你想添加的用戶表,其他的以後添加此加入

JOIN users ON a.user_id = users.id 

,並對其進行過濾,加入這個連接

WHERE users.city=1 

發出後

SELECT a.id as a_id, a.info as a_info, b.id as b_id, b.info as b_info 
FROM stats AS a 
JOIN stats as b on a.id != b.id 
JOIN users ON a.user_id = users.id 
WHERE users.city=1 
LIMIT 25 
+0

感謝您的消息。我會有一個問題 - 不應該在那裏而不是'JOIN用戶在a.user_id = users.id'上:'JOIN用戶在a.user_id = users.id和b.user_id = users.id' - 因爲我可能需要來自同一城市的兩個項目('a'和'b') – user984621

+0

。這取決於你想要什麼。您可能需要加入兩組用戶表,因爲a和b可能有不同的用戶? – podiluska

1

爲了方便起見,我已經重新格式化了原始SQL語句以使其人類可讀。

SELECT a.id AS a_id 
    , a.info AS a_info 
    , b.id AS b_id 
    , b.info AS b_info 
    FROM stats a 
    JOIN stats b 
    ON a.id != b.id 
LIMIT 25 

您當前的查詢幾乎返回笛卡爾積。來自統計數據的每一行都與統計數據中的每一行進行匹配,除了匹配自身。 (假設stats.id是主鍵或唯一鍵。)

要添加一個連接到用戶表,限制行從a返回,例如:

SELECT a.id AS a_id 
    , a.info AS a_info 
    , b.id AS b_id 
    , b.info AS b_info 
    FROM stats a 
    JOIN users au ON au.id = a.user_id AND au.city=1 
    JOIN stats b ON a.id != b.id 
LIMIT 25 

如果要限制返回的行兩個ab,再添加入到users表:

SELECT a.id AS a_id 
    , a.info AS a_info 
    , b.id AS b_id 
    , b.info AS b_info 
    FROM stats a 
    JOIN users au ON au.id = a.user_id AND au.city=1 
    JOIN stats b ON a.id != b.id 
    JOIN users bu ON bu.id = b.user_id AND bu.city=1 
LIMIT 25 

這是不是爲了實現這一目標的唯一途徑。例如,您可以使用a.user_id IN (subquery)或​​謂詞。

(如果您使用可讀的格式進行格式化,SQL更容易使用。)

1

下面是做到這一點的一種方法:

SELECT a.id as a_id, a.info as a_info, 
     b.id as b_id, b.info as b_info 
FROM stats AS a 
JOIN stats as b 
    ON a.id != b.id 
where a.user_id in (select user_id from users where users.city = 1) 
LIMIT 25 

你也可以使用這個作爲連接(這在MySQL是更有效):

SELECT a.id as a_id, a.info as a_info, 
     b.id as b_id, b.info as b_info 
FROM stats AS a 
JOIN stats AS b 
    ON a.id != b.id 
JOIN users AS u 
    ON a.user_id = u.user_id 
    AND u.city_id = 1 
LIMIT 25