2012-11-05 61 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