posts
テーブルと、列postmeta
を含むテーブルがmeta_key
ありますmeta_value
。以下に簡略化したテーブル構造を示します (いくつかのデモ データを使用)。
CREATE TABLE `posts` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(200) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
INSERT INTO `posts` (`id`, `title`) VALUES
(1,'First post'),
(2,'Second post'),
(3,'Third post'),
(4,'Fourth post');
CREATE TABLE `postmeta` (
`meta_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`post_id` int(11) NOT NULL,
`meta_key` varchar(200) NOT NULL DEFAULT '',
`meta_value` text NOT NULL,
PRIMARY KEY (`meta_id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
INSERT INTO `postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES
(1,1,'rating','80'),
(2,1,'total_votes','500'),
(3,2,'rating','80'),
(4,2,'total_votes','501'),
(5,3,'rating','95'),
(6,3,'total_votes','200');
投稿は評価順に並べる必要があります。評価のない投稿も含める必要があるため、LEFT JOIN
. 問題ない:
SELECT *
FROM posts p
LEFT JOIN postmeta m ON p.id = m.post_id AND m.meta_key = 'rating'
ORDER BY m.meta_value DESC
ただし、同じ評価の投稿については、テーブルの別の行に格納されている総投票数でさらに並べ替えたいと思いpostmeta
ます。上記の例では、1 番目と 2 番目の投稿の評価は 80 ですが、2 番目の投稿の方が投票数が多いため、最初の投稿よりも前に注文する必要があります。単一のクエリでそれをどのようにやってのけるでしょうか?