按日期顺序排序注释的问题

时间:2011-09-20 20:07:29

标签: mysql sql

我是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;

感谢您的时间。

3 个答案:

答案 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。