2012-11-05 5 views
0

posts 테이블과 postmeta 테이블에 meta_keymeta_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 테이블의 다른 행에 저장되어 카운트 총 투표에 의해 그들을 주문 좋아하는 것이다. 위의 예에서 첫 번째와 두 번째 게시물의 등급은 80이지만 두 번째 게시물의 투표 수가 더 많으므로 첫 번째 게시물보다 먼저 주문해야합니다. 어떻게 하나의 쿼리에서 그걸 풀까요?

답변

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 Fiddle Example

출력 :

| 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) | 
+1

신난다! 나는 SQL Fiddle 사이트에도 책갈피를 지정하고 편리하게 올 것이다. 감사! – Geert

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 
관련 문제