我是MySQL的新手,我在排序两个表时遇到问题。
这个SQL是关于对书籍的最新评论进行排序,但是我将这些书籍按照它们的第一条评论排序,而不是最新的。
SELECT b.*, c.date_added as date FROM books b
LEFT JOIN comments c ON (b.id = c.book_id)
GROUP BY b.id
ORDER BY date DESC
LIMIT 5
CREATE TABLE IF NOT EXISTS `books` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`caption` varchar(255) COLLATE utf8_bin NOT NULL,
`author` varchar(255) COLLATE utf8_bin NOT NULL,
`pages` int(11) NOT NULL,
`category_id` int(11) NOT NULL,
`filename` varchar(255) COLLATE utf8_bin NOT NULL,
`description` text COLLATE utf8_bin NOT NULL,
`date_added` datetime NOT NULL,
`publisher` varchar(255) COLLATE utf8_bin NOT NULL,
`price` decimal(10,2) NOT NULL,
`times_sold` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE IF NOT EXISTS `comments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`book_id` int(11) NOT NULL,
`author` varchar(255) COLLATE utf8_bin NOT NULL,
`email` varchar(255) COLLATE utf8_bin NOT NULL,
`body` text COLLATE utf8_bin NOT NULL,
`date_added` datetime NOT NULL,
`approved` tinyint(4) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
感谢您的时间。
答案 0 :(得分:2)
这应该可行。您正在b.id上指定组,但由于您对每本书都有多个注释,因此需要在c.date_added上使用聚合函数。在这种情况下,您可以使用MAX显示最近的评论日期。
SELECT b.*, MAX(c.date_added) as date FROM books b
LEFT JOIN comments c ON (b.id = c.book_id)
GROUP BY b.id
ORDER BY MAX(c.date_added) DESC
LIMIT 5
答案 1 :(得分:0)
“分组依据”子句不正确,您需要将其删除。
'Group By'用于聚合函数,如Min()和Max()。
试试这个
SELECT b.*, c.date_added FROM books b
JOIN comments c ON
c.book_id = b.id
ORDER BY c.date_added DESC
LIMIT 5
答案 2 :(得分:0)
没有名为'date'的字段,您需要按照表格中的date_added(ORDER BY date_added DESC)订购它! 如果它仍然没有正确的顺序,只需使用ASC而不是DESC。