SQL Сортировка по популярности? - PullRequest
0 голосов
/ 14 октября 2011

Как выполнить сортировку по популярности пользователя при использовании отношения таблицы hasAndBelongsToMany? то есть:

У меня есть стол, который называется 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;

Ответы [ 3 ]

2 голосов
/ 14 октября 2011
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 и на некоторых моих собственных данных, и это работает

1 голос
/ 14 октября 2011
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.

0 голосов
/ 14 октября 2011

Я думаю, что этот запрос должен работать.

SELECT pgp.playgroup_id, COUNT(pgp.id)
FROM playgroups_players pgp
GROUP BY pgp.playgroup_id
ORDER BY count(pgp.id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...