【发布时间】:2013-10-12 22:07:37
【问题描述】:
我有两张这样的表;
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
这仅选择 1 张图片和picture_votes 中的所有条记录。
【问题讨论】:
-
添加
GROUP BY pictures.picture_id。附带说明一下,我更喜欢ON中的JOIN子句,而不是WHERE。 -
SELECT pictures.*, count(picture_votes.vote) as vote_count FROM pictures JOIN picture_votes ON (pictures.picture_id = picture_votes.picture_id) GROUP BY pictures.picture_id ORDER BY pictures.upload_date DESC LIMIT $limit有效,但它只会选择在picture_votes表中投票的图片。没有投票的图片不被选中。 -
啊,所以你想要一个
LEFT JOIN(它会给你所有的照片,即使没有投票)。 -
非常感谢!现在就像一个魅力。如果
null是null,有什么方法可以将vote_count列更改为0,还是我必须在PHP 中这样做? -
IFNULL(COUNT(...),0)