我有一个books
表,用于存储书籍版本。通常,在我的数据库中多次插入同一本书,因为它以不同的形式存在(精装本,平装本,电子书等)。每本书都有以下领域(其中包括):
现在,如果有另一个sales
表存储销售额并且看起来像这样:
我需要获得畅销书的列表,将书籍的不同版本分组,好像有相同的书,所以我的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的“风暴大师”一书分组。
我需要在我的sql查询(最好)或我的数据库方案中更改什么才能通过一个查询获得我想要的内容?
答案 0 :(得分:2)
问题出在CASE
子句的GROUP BY
上。你在那里混合" item"用" id"。
理想情况下,您应该为books
表格中的任何图书保留一个条目,并为包含这些字段的图书格式设置不同的表格:
books
。id
); 使用您当前的设计,尝试使您在CASE
表达式中使用的两个ID的范围不重叠(fe为books
添加前缀。id
):< / p>
GROUP BY (CASE WHEN `item` IS NOT NULL THEN `item` ELSE CONCAT('book-', `books`.`id`) END)
同一表达式的一个更简单的形式(更容易阅读和理解)是:
GROUP BY IFNULL(`item`, CONCAT('book-', `books`.`id`))