2014-11-01 71 views
0

我有一個非常簡單的表 - follow - 其中我存儲的追隨者。上述獲取用戶與追隨者,並沒有關注者

user | following 
----------------- 
1 | 2 

該裝置用戶1跟隨用戶2

我想要顯示主頁上的所有用戶,並命令他們購買最多關注者,然後返回其他沒有關注者的用戶。下面的查詢正在顯示用戶,但我無法弄清楚如何檢索沒有任何關注者的用戶。我試過RIGHT JOIN users u ON f.following=u.id但這給我奇怪的結果。

此查詢返回用戶2誰有追隨者,但不返回用戶13誰沒有追隨者。

編輯:此查詢也檢查用戶是否關注,這就是爲什麼我加入使用ID爲1作爲測試。

SELECT 
    u.id 
    ,u.username 
    ,u.avatar 
    ,COUNT(1) AS followers 
    ,ul.* 
    ,fo.* 
FROM follow f 
LEFT JOIN users u ON f.following=u.id 
LEFT JOIN follow fo ON fo.following=u.id AND fo.user=1 
LEFT JOIN users_likes ul ON ul.likes=u.id AND ul.user=1 
GROUP BY f.following 
ORDER BY COUNT(1) DESC 

SQL小提琴:http://sqlfiddle.com/#!2/98f65/1

+0

是不是那麼簡單,如[*見示例*](http://sqlfiddle.com/#!2/3421e/2)? – 2014-11-01 20:46:49

回答

0

在這個問題您查詢的問題是,你是左加入到後續表。這意味着後續表格中的所有行都包含在內,而與其他表格的連接無關。你想要的是顯示所有用戶,所以這就是應該在連接外端的表。

我也認爲你在這裏試圖做太多事情,這就是爲什麼你很難找出答案。你想知道誰有追隨者,誰不追隨,誰追隨他們,訂購他們,考慮users_likes等等。我建議退後一步,將其分解爲單個查詢,然後根據需要將它們構建到一個結果集中。

要得到用戶和追隨者的數量,可以外連接用戶表與後續的表是這樣的:

SELECT u.id, u.username, u.avatar, (IFNULL(COUNT(f.following), 0)) AS numFollowers 
FROM users u 
LEFT JOIN follow f ON f.following = u.id 
GROUP BY u.id 
ORDER BY numfollowers DESC; 

IFNULL被用來檢查的情況時有沒有追隨者,並沒有鏈接是在外連接中創建的,因此出現空值。

如果你想在users_likes表中工作,你應該添加它作爲另一個左連接。造成這個問題的原因是,如果沒有喜歡,它將爲所有列返回空值。 (例如,如果我在此處加入users_likes表,我會在用戶1和3看到null,因爲沒有人喜歡它們。)爲了使結果集更容易理解,我建議您不要收集所有行users_likes表。也許這查詢會更有意義:

SELECT u.id, u.username, u.avatar, (IFNULL(COUNT(f.following), 0)) AS numFollowers, ul.user AS likedByUser, ul.created_at 
FROM users u 
LEFT JOIN follow f ON f.following = u.id 
LEFT JOIN users_likes ul ON ul.likes = u.id 
GROUP BY u.id 
ORDER BY numfollowers DESC; 

至於用戶是否被回之後,我覺得這會改變一點,因爲上面只顯示追隨者的數量,且不會產生每個追隨者一排。

讓我知道如果您有任何問題,這裏是上述SQL Fiddle。我將留給你處理現在發生的空值。

+0

謝謝,這是解決方案中最接近的一個。我試圖完成的是列出所有用戶和「ORDER BY」多個追隨者(如果他們沒有任何追隨者,然後按用戶名命令),那麼確定用戶1是否追隨他們,並且如果用戶1喜歡他們。希望清除它。 :) – timgavin 2014-11-01 23:25:13

+0

@Tim,好吧。這很容易在users_likes加入中添加'AND user = 1'。你也可以做同樣的事情,找出用戶1是否通過再次加入關注表來跟蹤他們。更新了[SQL小提琴](http://sqlfiddle.com/#!2/98f65/60)。 – AdamMc331 2014-11-01 23:33:15

+0

完美!謝謝你的幫助和很好的解釋:) – timgavin 2014-11-01 23:43:51

0

您可以在任何數量的方式使用外連接(左或右),從用戶到當前的查詢。一個easy example,應該讓你開始。這不是一個清理解決方案,只是一種可行的方式。

SELECT a.* 
     ,b.* 
    FROM users a 
     LEFT JOIN (
SELECT 
    u.id 
    ,u.username 
    ,u.avatar 
    ,COUNT(1) AS followers 
FROM follow f 
LEFT JOIN users u ON f.following=u.id 
LEFT JOIN follow fo ON fo.following=u.id AND fo.user=1 
LEFT JOIN users_likes ul ON ul.likes=u.id AND ul.user=1 
GROUP BY f.following 
) b 
ON a.id = b.id 
ORDER BY followers DESC 
0

你可以這樣做:

 
SELECT * FROM (
    SELECT u.id, u.username, u.avatar, COUNT(f.user) as followers 
    FROM users AS u 
    LEFT JOIN follow AS f ON u.id = f.following 
    GROUP BY u.id 
) AS subselect ORDER BY subselect.followers DESC