2013-05-29 50 views
0

我有4個表複式左聯接返回雙排

  • 用戶
  • 圖片
  • 消息
  • friendrequests

我試圖讓好友請求和新郵件一個查詢。它運作良好,但當我離開join'friendsreuqests'時,我得到多行。

這裏是我的查詢:

SELECT username, 
    f1.userid as reqId, 
    m1.msg, m1.userid, 
    p1.picHash, p1.extension, UNIX_TIMESTAMP(m1.sent) AS date 
FROM users 
    LEFT JOIN pictures p1 ON p1.userid = users.id 
    LEFT JOIN messages m1 ON m1.contactid = users.id AND m1.delivered =0 
    LEFT JOIN friendrequests f1 ON f1.contactid = users.id AND f1.delivered=0 AND f1.request =1 
WHERE users.id =7 
ORDER BY date ASC 

這是MySQL結果:

Kungen 3  gregegerg  1 dc825b1c8a35593be4d172db7 jpg 1369839537 
Kungen 12 gregegerg  1 dc825b1c8a35593be4d172db7 jpg 1369839537 
Kungen 3  HEJH   1 dc825b1c8a35593be4d172db7 jpg 1369839540 
Kungen 12 HEJH   1 dc825b1c8a35593be4d172db7 jpg 1369839540 

正如你看到有效果加倍。在這一點上我只想得到兩行。如果我有兩個新消息但沒有新朋友請求這兩行應該是NULL。

+1

在SELECT之後添加DISTINCT會爲您提供不同的結果,但實際上您有4個不同的行,因此您可能想要合併不關心的字段或不選擇它們。 –

+0

@Goat_CO再看一遍 - 第二列並不鮮明。由於該列('f1.userid')是他從「friendrequests」表中選擇的唯一一個,所以我懷疑他真正的問題在於那裏的數據。 – Blazemonger

+0

distinct將不會幫助 – Kilise

回答

2

如果你想在一個查詢中獲得好友請求消息,那麼我希望查詢有一個union all。您的查詢正在進行表格之間的連接。這會將有關朋友請求的信息添加爲。你需要額外的行。

我不確定朋友表中的哪些字段對應於您請求的字段。但這裏是使用union all查詢的例子:

SELECT username, users.id as reqId, m1.msg, m1.userid, 
     p1.picHash, p1.extension, UNIX_TIMESTAMP(m1.sent) AS date 
FROM users LEFT JOIN 
    pictures p1 ON p1.userid = users.id LEFT JOIN 
    messages m1 ON m1.contactid = users.id AND m1.delivered =0 
WHERE users.id =7 
union all 
SELECT username, users.id as reqId, NULL, NULL, 
     NULL, NULL, UNIX_TIMESTAMP(f1.sent) AS date 
FROM users LEFT JOIN 
    friendrequests f1 
    ON f1.contactid = users.id AND f1.delivered=0 AND f1.request =1 
ORDER BY date ASC 
+0

太棒了!只需稍微編輯一下代碼,但所有工會都會有所作爲 – Kilise

0

添加GROUP BY子句中的所有字段肯定會有所幫助,但是您必須決定第二個字段要保留的值(3或12)。 如果你肯定知道,總有2行與該場不同的,比你可以選擇這兩個MIN(m1.msg)MAX(m1.msg)

1

如果LEFT JOIN兩個好友請求和消息像你這樣做你會得到任何消息的朋友次數的結果集中的請求。在你的例子中,你有2個請求和2條消息導致(2 * 2 =)4行。

也許你應該考慮使用union來代替?使用union,您將可以爲每個朋友請求獲得一行,爲每條消息獲得一行。這應該更適合您的需求。 儘管如此,你仍然會在你的例子(2 + 2)中得到4行。

+1

tackar;)det var det sombehövdes – Kilise

0

的問題是,前兩個加入後你得到這個如果即時通訊的權利:

Kungen gregegerg  1 dc825b1c8a35593be4d172db7 jpg  1369839537 
Kungen HEJH   1 dc825b1c8a35593be4d172db7 jpg  1369839540 

現在與f1.contactid = users.id加入friendrequests表你加入兩個條目用戶3和12的要求,由此導致用戶ID 1

Kungen 3 gregegerg  1 dc825b1c8a35593be4d172db7 jpg  1369839537 
Kungen 12 gregegerg  1 dc825b1c8a35593be4d172db7 jpg  1369839537 
Kungen 3 HEJH   1 dc825b1c8a35593be4d172db7 jpg  1369839540 
Kungen 12 HEJH   1 dc825b1c8a35593be4d172db7 jpg  1369839540 

現在,讓你正確的結果需要在與消息或時間戳相關聯的東西上加入friendrequests表,因爲這是唯一不同的列。