从表中选择记录,然后从另一个表中选择记录计数

时间:2013-10-12 13:54:48

标签: php mysql sql

我有两个看起来像这样的表;

   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_votespictures.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中仅选择1张图片和所有记录的数量。

2 个答案:

答案 0 :(得分:1)

真的想要使用 LEFT 加入,因为这将返回所有图片,而不仅仅是投票的图片。你也应该做总和(pv.vote)vs 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;

答案 1 :(得分:1)

如果您picture_id表上的picture_votes被编入索引,则以下内容可能比加入更快:

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

这可能完全跳过表的内容,并允许您简单地计算哈希表中的记录,这应该更快。