【发布时间】:2014-12-05 11:16:26
【问题描述】:
我有一个存储书籍版本的books 表。通常,同一本书会多次插入我的数据库中,因为它以不同的形式存在(精装本、平装本、电子书等)。每本书都有以下字段(除其他外):
- id(唯一的主键)
- 标题
- item(它是一个int,同一本书的两种不同形式将具有相同的项目,即 仅以一种形式存在将为 NULL)
现在如果有另一个 sales 表来存储销售额并且看起来像这样:
- id(唯一主键)
- book_id(与 book.id 有关)
- 日期(销售发生的日期)
我需要获取畅销书的列表,将不同版本的书分组,就好像有同一本书一样,所以我的 sql 查询看起来像:
SELECT `books`.`title`, COUNT(`sales`.`id`)
FROM `sales`
JOIN `books` ON `books`.`id` = `sales`.`book_id`
GROUP BY (CASE WHEN `item` IS NOT NULL THEN `item` ELSE `books`.`id` END)
问题在于 ID 为 27057 且项目为 NULL 的书 «Margherita Dolcevita» 与 ID 为 49522 和项目 27057 的书 «Master of the Storm» 分组。
我需要在我的 sql 查询(最好)或我的数据库方案中进行哪些更改才能仅通过一个查询获得我想要的内容?
【问题讨论】:
-
为什么不按书名分组?
-
因为有几本书有相同的标题但没有共同点,很遗憾。
-
我会尝试按 2 个字段分组,包括 item 和 books.id - GROUP BY item, IF(item IS NULL, books.id, NULL) 。这应该按项目对它们进行分组,对于那些具有 NULL 项目的项目,它也将按 id 分组
-
按 Book.id 分组 * 10000 + case 当 item 为 null 然后 -1 else item end
-
@Kickstart 提出的解决方案应该也可以。