2015-06-24 55 views
1

我有兩個連接同一個表的SQL查詢的基本問題。這聽起來很簡單,但我有一些麻煩。我希望,任何人都可以幫我解決這個問題:)在一個查詢中計數的同一個表上的多個連接

我有兩個小表:「人」(列:id,name,...)和「likes」(id,who,who)。人們可以設置彼此的「喜歡」。這種關係是多方面的。 我想得到與人民喜歡的表:收到「喜歡」的數量,交付和相互喜歡的數量。 當我只使用一個連接時,所有的都是正確的。但是對於兩個連接(或更多),MySQL將所有行組合(如預期的那樣),並且計數中出現錯誤的值。我不知道,我必須如何在這種情況下使用count /總和/組,由運營商:(我想在一個查詢做到不子查詢

我用這樣的查詢:

SELECT *, count(l1.whom), count(l2.whom) 
FROM people p 
LEFT JOIN likes l1 ON l1.who = p.id 
LEFT JOIN likes l2 ON l2.whom = p.id 
GROUP BY p.id; 

SELECT p.id, name, 
    count(lwho.who) delivered_likes, 
    count(lwhom.whom) received_likes, 
    count(lmut.who) mutual_likes 
FROM people AS p 
LEFT JOIN likes AS lwho ON p.id = lwho.who 
LEFT JOIN likes AS lwhom ON lwhom.id = lwho.id 
LEFT JOIN likes AS lmut ON lwhom.who = lmut.whom AND lwhom.whom = lmut.who 
GROUP BY p.id; 

但它喜歡計算不正確的計數。

這只是問題的訓練和成績並不重要,但我想,有三個連接在我的最後一個查詢是很多。我可以使用2個連接嗎?

在此先感謝您的幫助。

+0

你的加入看起來很好。但是,您應該確保按查詢中的所有列對您進行分組,而不是按照您的第二個查詢中的「name」進行分組。我無法忍受MySQL允許這樣做。 – Andrew

回答

2

我推測peoplelikes之間存在1:N關係。你的第二個查詢

一個問題,據我所知,是的likeslwhom相關性通過id=id加入到lwho。基本上lwhomlwho。我建議將此關聯的ON子句從lwhom.id = lwho.id更改爲p.id = lwhom.whom

但是,計數仍將受JOIN的影響。然而,假設你在likes表中有一個ID列,那麼你可以讓每個COUNT表示每個人不同的Like ID - 如果沒有,可以考慮使用COUNT(DISTINCT correlation.*)來代替。

離題不談,下面應該有希望的工作:

SELECT p.id, name, 
    count(distinct lwho.id) delivered_likes, 
    count(distinct lwhom.id) received_likes, 
    count(distinct lmut.id) mutual_likes 
FROM people AS p 
LEFT JOIN likes AS lwho ON p.id = lwho.who 
LEFT JOIN likes AS lwhom ON p.id = lwhom.whom 
LEFT JOIN likes AS lmut ON lwhom.who = lmut.whom AND lwhom.whom = lmut.who 
GROUP BY p.id,p.name; 

我有一個SQL小提琴here

+0

嘿,亞當。 非常感謝您的回答和示例。它也適用於我。它幫助我理解我的錯誤。 它應該小心幾個連接和分組:) PS當然,關係是一個1:N - 一個人類和更喜歡。這是我描述中可悲的錯誤。 – Juljan

相關問題