0

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 番目の投稿の方が投票数が多いため、最初の投稿よりも前に注文する必要があります。単一のクエリでそれをどのようにやってのけるでしょうか?

4

2 に答える 2

2
SELECT * <-- you'll want to specify columns here
FROM posts p
LEFT JOIN postmeta m ON p.id = m.post_id AND m.meta_key = 'rating'
LEFT JOIN postmeta mv ON p.id = mv.post_id AND mv.meta_key = 'total_votes'
ORDER BY m.meta_value DESC, mv.meta_value DESC

SQL フィドルの例

出力:

| ID |       TITLE | META_ID | POST_ID | META_KEY | META_VALUE |
----------------------------------------------------------------
|  3 |  Third post |       5 |       3 |   rating |         95 |
|  2 | Second post |       3 |       2 |   rating |         80 |
|  1 |  First post |       1 |       1 |   rating |         80 |
|  4 | Fourth post |  (null) |  (null) |   (null) |     (null) |
于 2012-11-05T20:05:24.710 に答える
1
SELECT *
FROM posts p
LEFT JOIN postmeta m ON p.id = m.post_id AND m.meta_key = 'rating'
LEFT JOIN postmeta m2 ON p.id = m2.post_id AND m2.meta_key = 'total_votes'
ORDER BY m.meta_value DESC, m2.meta_value Desc
于 2012-11-05T20:05:34.043 に答える