我有一個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
表。在上面的例子中,第一篇文章和第二篇文章的評分爲80分,但由於第二篇文章有更多投票,應該在第一篇文章之前下訂單。你如何在單個查詢中解決這個問題?
真棒!我也會將這個SQL Fiddle網站加入書籤,會派上用場。謝謝! – Geert