0

次のような 2 つのテーブルがあります。

   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,

そして、私がやりたいことは、テーブルからすべてのフィールドを選択し、次にwherepictures内のすべてのレコードの数を選択することです。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

これにより、画像が 1 つだけ選択され、 内のすべてのレコードがカウントされpicture_votesます。

4

2 に答える 2

1

投票のある写真だけでなく、すべての写真が返されるため、実際にはLEFT結合を使用する必要があります。また、投票が 1 を超えた場合に備えて、 sum(pv.vote) と COUNT() を実行する必要があります (そうなる可能性があります!考えてみてください: プレミアム アカウント == 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;
于 2013-10-12T14:03:25.697 に答える