2013-08-06 4 views
1

Я создал систему голосования в php и mysql. Когда пользователь голосует за идентификатор, запись вставляется в «голосов», ссылающихся на FK media_id. Когда я затем вывести записи я использую этот запрос, чтобы получить количество голосов для каждой записи:Mysql одно для многих отношений. Порядок по количеству строк во второй таблице

$sql = "SELECT COUNT(*) FROM insta_votes WHERE media_id ='".$mediaid."'"; 
if ($res = $db->query($sql)) { 
    return $res->fetchColumn(); 
} 
return 0; 

Это прекрасно работает, но я хочу, чтобы иметь возможность сортировать результаты по количеству голосов, которые они имеют. Предпочтительно использовать только один запрос. Как я могу это достичь?

Таблицы структурированы следующим образом:

votes table 
+-----------+--------------+------+-----+-------------------+----------------+ 
| Field  | Type   | Null | Key | Default   | Extra   | 
+-----------+--------------+------+-----+-------------------+----------------+ 
| id  | int(11)  | NO | PRI | NULL    | auto_increment | 
| media_id | varchar(255) | NO |  | NULL    |    | 
| ip  | varchar(20) | NO |  | NULL    |    | 
| c_time | timestamp | NO |  | CURRENT_TIMESTAMP |    | 
| sessionid | varchar(30) | NO |  | NULL    |    | 
+-----------+--------------+------+-----+-------------------+----------------+ 

entries table 
+---------------+--------------+------+-----+-------------------+-------+ 
| Field   | Type   | Null | Key | Default   | Extra | 
+---------------+--------------+------+-----+-------------------+-------+ 
| page_id  | int(11)  | NO | MUL | NULL    |  | 
| media_id  | varchar(255) | NO | PRI | NULL    |  | 
| url   | varchar(255) | NO |  | NULL    |  | 
| c_time  | datetime  | NO |  | NULL    |  | 
| likes   | int(11)  | YES |  | NULL    |  | 
| deleted  | tinyint(1) | NO |  | 0     |  | 
| inserted_time | timestamp | YES |  | CURRENT_TIMESTAMP |  | 
| numReports | int(11)  | NO |  | 0     |  | 
+---------------+--------------+------+-----+-------------------+-------+ 

Спасибо!

+0

Вы пробовали 'ORDER BY'? –

+0

Проблема в том, что я хочу получить записи в таблице записей, упорядоченной по количеству записей с этим медиа-идентификатором в таблице голосов. – Cobradelaplaya

ответ

4

Если я правильно понимаю таблицы (и не может), каждая строка entries может ссылаться на несколько строк votes. В этом случае запрос вам нужно будет идти-то вроде этого:

SELECT 
    entries.page_id, 
    COUNT(*) AS VoteCount 
FROM entries 
INNER JOIN votes ON entries.media_id = votes.media_id 
GROUP BY entries.page_id 
ORDER BY VoteCount 

Если добавить дополнительные entries столбцов в SELECT список, не забудьте добавить их в GROUP BY список.


Добавление: @JuanPabloCalifano указал, правильно, что этот запрос не будет содержать записи с нулевыми голосов. Вот как их включить:

SELECT 
    entries.page_id, 
    COALESCE(COUNT(votes.id), 0) AS VoteCount 
FROM entries 
LEFT JOIN votes ON entries.media_id = votes.media_id 
GROUP BY entries.page_id 
ORDER BY VoteCount 
+0

Отлично! Работал совершенным с небольшой модификацией: SELECT *, COUNT (*) AS VoteCount ИЗ insta_entries INNER JOIN insta_votes ON insta_entries.media_id = insta_votes.media_id GROUP BY insta_entries.media_id ORDER BY VoteCount – Cobradelaplaya

+2

Имейте в виду, что если вы делаете внутреннее соединение, записи без голосов не будут перечислены. Я думаю, вам нужно левое соединение здесь. –

+1

Хороший улов @JuanPabloCalifano! Я действительно знаю лучше этого: Cobradelaplaya - если вам нужно включить записи с нулевым голосом, пожалуйста, см. Добавление к моему ответу. –

0
SELECT COUNT(*) as CNT, `media_id` FROM `insta_votes` GROUP BY `media_id` order by 1; 
0
SELECT COUNT(*), media_id FROM insta_votes 
GROUP BY media_id 
ORDER BY COUNT(*);"