2013-10-12 4 views
0

У меня есть две таблицы, которые выглядят так:Выбор записей из таблицы, а затем выбор количества записей из другой таблицы

Table: pictures 
    `picture_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `picture_title` varchar(255) NOT NULL, 
    `picture_description` text NOT NULL, 
    `picture_src` varchar(50) NOT NULL, 
    `picture_filetype` varchar(10) NOT NULL, 
    `picture_width` int(11) NOT NULL, 
    `picture_height` int(11) NOT NULL, 
    `user_id` int(10) unsigned NOT NULL, 
    `upload_date` datetime NOT NULL, 

-

Table: picture_votes 
    `vote_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `picture_id` int(10) unsigned NOT NULL, 
    `vote` tinyint(4) NOT NULL, 
    `user_id` int(10) unsigned NOT NULL, 
    `timestamp` datetime NOT NULL, 

И то, что я хочу сделать, это выбрать все поля из pictures таблицы, а затем количество всех записей в picture_votes где pictures.picture_id = picture_votes.picture_id, как, например,

picture_id => 1 
picture_title => 'Pic title' 
picture_description => 'Pic description' 
picture_src => 'b8b3f2c3a85f1a46fbf2ee132d81f783' 
picture_filetype => 'jpg' 
picture_width => 612 
picture_height => 612 
user_id => 1 
upload_date => '2013-10-12 12:00:00' 
vote_count => 3 // Amount of records in `picture_votes` that has `picture_id` = 1 

Я придумал (где $limit это количество снимков для выбора);

SELECT pictures.*, count(picture_votes.vote) as vote_count 
    FROM pictures, picture_votes 
    WHERE pictures.picture_id = picture_votes.picture_id 
    ORDER BY upload_date DESC 
    LIMIT $limit 

Это выбирает только один снимок и подсчет всех записей в picture_votes.

+0

Добавить 'GROUP BY pictures.picture_id'. Замечание, я предпочитаю свои предложения 'JOIN' в' ON', а не в 'WHERE'. – Wrikken

+0

'выбора изображений. *, Граф (picture_votes.vote), как vote_count из фотографий РЕГИСТРИРУЙТЕСЬ picture_votes ВКЛ (pictures.picture_id = picture_votes.picture_id) GROUP BY pictures.picture_id ORDER BY DESC pictures.upload_date LIMIT $ limit' работы но он будет выбирать только фотографии, голосовавшие в таблице 'picture_votes'. Фотографии без голосов не выбраны. – Unidan

+0

А, так что вы хотите «LEFT JOIN» (который даст вам все фотографии, даже без голосов). – Wrikken

ответ

1

Вы действительно хотите использовать ЛЕВЫЙ присоединиться, потому что это будет возвращать все фотографии, а не только те, с голосованием. ! Вы должны также сделать сумму (pv.vote) против COUNT() упаковывает ваши голоса никогда больше, чем 1 (эй, это может случиться Подумать только: Премиум аккаунта == x2 голосов ;-)

SELECT p.*, SUM(pv.vote) votes FROM pictures p 
LEFT JOIN picture_votes pv 
    ON pv.picture_id=p.picture_id 
GROUP BY pv.picture_id 

Если вы когда-либо хотел, чтобы отсортировать, скажем, топ количество 10 голосов:

SELECT * FROM (
    SELECT p.*, SUM(pv.vote) votes FROM pictures p 
    LEFT JOIN picture_votes pv 
     ON pv.picture_id=p.picture_id 
    GROUP BY pv.picture_id 
) AS aggregate 
ORDER BY votes DESC 
LIMIT 10; 
+0

То, как я это сделал сейчас, состоит в том, что голосование ('pv.vote') равно +1 или -1. Есть ли у вас другое решение, как подсчитать голоса, которые просто увеличиваются на 1 или уменьшаются на 1? Я хочу сделать, чтобы подсчитать общее количество голосов, а не сумму, между прочим. Спасибо за ответ, работает как шарм. – Unidan

+0

, чтобы подсчитать общее количество, независимо от их значения, используйте COUNT (pv.vote) AS totalVotes –

1

Если picture_id индексируется на вашем picture_votes столе, то следующее может быть даже быстрее, чем присоединиться:

SELECT * 
     , (SELECT COUNT(*) FROM picture_votes WHERE picture_id = pictures.picture_id) 
FROM pictures 

Это может пропустить Контент s таблицы и позволяют просто подсчитывать записи в хеш-таблице, которая должна быть быстрее.

+0

Насколько универсален этот запрос? Могу ли я, например, иметь возможность сортировать 10 лучших голосов, например, решение @ Theodore R. Smith? Насколько быстрее это происходит, если таблица изображений содержит 10 000 записей, а таблица голосования содержит 100 000 записей? – Unidan

+0

@WillB - как и при любой настройке производительности, в значительной степени вам просто нужно попробовать. – JDB

Смежные вопросы