1

我想通過使用下面的兩個嵌套查詢來創建我的網站上成員的排行榜。使用嵌套查詢在MySQL中創建排行榜(排名成員列表)

第一個查詢抓住成員的名單:

SELECT member_id, username, screen_name FROM exp_members WHERE group_id IN (1,5) LIMIT 100 

第二個查詢嵌套在第一查詢中,並抓住多少次成員的條目已經收藏了數:

SELECT COUNT(*) AS favorite_count 
    FROM qb_channel_titles, qb_channel_data, qb_matrix_data 
    WHERE qb_channel_titles.channel_id = '1' 
    AND qb_channel_titles.entry_id = qb_channel_data.entry_id 
    AND qb_channel_titles.entry_id = qb_matrix_data.entry_id 
    AND field_id = '13' 
    AND author_id = 'MEMBER_ID_FROM_FIRST_QUERY' 
    ORDER BY favorite_count DESC" 
} 

所以我的代碼是這樣的:

[first query] 
    [second query] 
     ..output one row of the leaderboard.. 
    [/second query] 
[/first query] 

嵌套第一GI內的第二查詢給我一個合適的成員名單和他們每次收到的投票數量,但該名單是按第一個(外部)查詢而不是第二個(內部)查詢進行排序的。

兩個問題:

  1. 我怎麼排序成員由favorite_count降序排列的列表?
  2. 什麼是最節約資源的方式來做到這一點?我懷疑嵌套查詢不是最好的方法,但我真的不知道更好。

回答

1

你想要做這樣的事嗎?

SELECT 
    member_id, 
    username, 
    screen_name, 
    (SELECT COUNT(*) AS favorite_count 
     FROM qb_channel_titles, qb_channel_data, qb_matrix_data 
     WHERE qb_channel_titles.channel_id = '1' 
     AND qb_channel_titles.entry_id = qb_channel_data.entry_id 
     AND qb_channel_titles.entry_id = qb_matrix_data.entry_id 
     AND field_id = '13' 
     AND author_id = member_id 
     ORDER BY favorite_count DESC") as "Votes" 
FROM 
    exp_members 
WHERE 
    group_id IN (1,5) 
ORDER BY 
    (SELECT COUNT(*) AS favorite_count 
     FROM qb_channel_titles, qb_channel_data, qb_matrix_data 
     WHERE qb_channel_titles.channel_id = '1' 
     AND qb_channel_titles.entry_id = qb_channel_data.entry_id 
     AND qb_channel_titles.entry_id = qb_matrix_data.entry_id 
     AND field_id = '13' 
     AND author_id = member_id 
     ORDER BY favorite_count DESC") 
LIMIT 100 

你也可以把這個查詢放在一個視圖和查詢視圖(排序嵌套另一個查詢性能明智的)。我不擅長性能,但我會說你可以使用觸發器並將favorite_count保存在另一個表中,並且每次用戶最喜歡觸發器都會更新。另一張桌子可能只有ID|COUNT。這會增加收藏時間,但會減少檢查排行榜的時間,所以效率將取決於您的用戶個人資料以用於收藏或查看排行榜...

+0

絕對搖滾。那很完美。我在最後的「限制100」之前添加了一個DESC以便正確排序。謝謝!我也很欣賞對演出的評論。我會爲未來保留觸發器。 – 2012-03-26 01:32:25