2011-10-14 35 views
0

當使用hasAndBelongsToMany表關係時,如何按用戶流行度排序?即:SQL按受歡迎程度排序?

我有一個表叫做playgroups,players和playgroup_players。

如何根據遊戲組中的玩家人數對玩具組進行排序?

幼兒遊戲組:

CREATE TABLE `playgroups` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `tag` varchar(4) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `description` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `avatar_url` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `city` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `state` varchar(2) COLLATE utf8_unicode_ci DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

玩家:

CREATE TABLE `players` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `first_name` varchar(30) DEFAULT NULL, 
    `last_name` varchar(30) DEFAULT NULL, 
    `username` varchar(30) NOT NULL, 
    `password` varchar(255) NOT NULL, 
    `email` varchar(255) NOT NULL, 
    `public_email` tinyint(1) NOT NULL DEFAULT '0', 
    `facebook_id` varchar(250) DEFAULT NULL, 
    `card_tooltip` tinyint(1) NOT NULL DEFAULT '1', 
    `profile_pic_url` varchar(255) NOT NULL, 
    `public_name` tinyint(1) NOT NULL DEFAULT '0', 
    `city` varchar(40) NOT NULL, 
    `state` varchar(2) NOT NULL, 
    `date_joined` datetime NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=107 DEFAULT CHARSET=latin1; 

而且PlaygroupPlayers:

CREATE TABLE `playgroup_players` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `player_id` int(11) NOT NULL, 
    `playgroup_id` int(11) NOT NULL, 
    `admin` tinyint(1) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 
+1

有關表格的小波動信息可能有所幫助。但是你可以看看Group By Clause。 選擇玩家羣,算上球員 從where子句 組由playerGroup 的結果應該有球員組和相應數量將代表該組中的玩家數量 – Zohaib

+0

好吧,我會後的表結構 – LordZardeck

回答

2
SELECT PP.playgroup_id, COUNT(*) cnt 
FROM playgroup_players PP 
GROUP BY PP.playgroup_id 
ORDER BY COUNT(*) DESC 

這會給你,至少有一個球員來分類的兒童遊戲名單由玩家數量決定。當然,字段名由:)

SELECT G.playgroup_id, COUNT(PP.playgroup_id) cnt 
FROM playgroup G 
    LEFT OUTER JOIN playgroup_players PP ON (PP.playgroup_id=G.playgroup_id) 
GROUP BY G.playgroup_id 
ORDER BY COUNT(*) DESC 

這應該給你所有遊戲小組(甚至那些沒有播放器)的列表。我已經在Oracle和我自己的一些數據上測試了這個,並且它可以工作

+0

一點也沒有表 號沒有工作。 :P只會帶來一個結果。 – LordZardeck

+0

我改變了第二個查詢,忘記了LEFT JOIN。立即嘗試 – phil

+0

好吧,工作!謝謝。現在在cakephp中使用它的有趣部分...:p – LordZardeck

0

我認爲這個查詢應該可以工作。

SELECT pgp.playgroup_id, COUNT(pgp.id) 
FROM playgroups_players pgp 
GROUP BY pgp.playgroup_id 
ORDER BY count(pgp.id) 
1
SELECT playgroups.*, d1.num_players 
FROM playgroups 
LEFT OUTER JOIN (
    SELECT playgroup_id, count(*) as num_players 
    FROM playgroup_players 
    GROUP BY playgroup_id 
) d1 
ON playgroups.id = d1.playgroup_id 
ORDER BY d1.num_players DESC 

內部查詢(a.k.a派生表),爲您提供每個幼兒遊戲的計數。外部查詢將其加回到playgroups的主要記錄中。如果您需要訪問playgroups中的非彙總列,則需要此表單。