SQL畅销书查询

SQL畅销书查询,sql,postgresql,Sql,Postgresql,我在每一个类别中都找不到畅销书。随附代码,我只能找到所需书籍的类别,但如何找到这本书 SELECT b.category_id, max(b.total_quantity) as max_quantity FROM ( SELECT books.id, books.category_id, sum(order_items.quantity) as total_quantity FROM order_items INNER JOIN orders

我在每一个类别中都找不到畅销书。随附代码,我只能找到所需书籍的类别,但如何找到这本书

SELECT b.category_id, max(b.total_quantity) as max_quantity
    FROM (
      SELECT books.id, books.category_id, sum(order_items.quantity) as total_quantity
      FROM order_items 
        INNER JOIN orders ON order_items.order_id = orders.id
        INNER JOIN books on order_items.book_id = books.id
      WHERE orders.status in (2, 3)
      GROUP BY books.id
    ) as b
    GROUP BY b.category_id

我猜您的图书表中一定有图书名称列。因此,您可以尝试以下查询-

SELECT b.book_name, b.category_id, max(b.total_quantity) as max_quantity
    FROM (
      SELECT books.id, books.book_name, books.category_id, sum(order_items.quantity) as total_quantity
      FROM order_items 
        INNER JOIN orders ON order_items.order_id = orders.id
        INNER JOIN books on order_items.book_id = books.id
      WHERE orders.status in (2, 3)
      GROUP BY books.id
    ) as b
    GROUP BY b.category_id

您可以在
having
子句中使用相关的聚合查询进行筛选,该查询返回相关类别的最畅销数量:

select b.id, b.category_id, sum(oi.quantity) as total_quantity
from order_items oi
inner join orders o on oi.order_id = o.id and o.status in (2, 3)
inner join books b on oi.book_id = b.id
having sum(oi.quantity) = (
    select sum(oi.quantity) 
    from order_items oi1
    inner join orders o1 on oi1.order_id = o1.id and o1.status in (2, 3)
    inner join books b1 on oi1.book_id = b1.id
    where b1.category_id = b.category_id
    group by b1.id
    order by sum(oi.quantity) desc
    limit 1
)
group by b.id, b.category_id
或者,如果您的RDBMS支持窗口函数(并允许将它们与聚合混合使用):


我会在总和上使用密秩。 如果在RDBMS中可用

SELECT *
FROM 
(
      SELECT books.id, books.category_id
      , SUM(orditm.quantity) AS total_quantity
      , DENSE_RANK() OVER (PARTITION BY books.category_id ORDER BY SUM(order_items.quantity) DESC) AS Rnk
      FROM order_items AS orditm
      JOIN orders ON orditm.order_id = orders.id
      JOIN books ON orditm.book_id = books.id
      WHERE orders.status IN (2, 3)
      GROUP BY books.id, books.category_id
) q
WHERE Rnk = 1

在上使用不同的

SELECT DISTINCT ON (b.id), b.*, SUM(oi.quantity) as total_quantity
FROM order_items oi JOIN
     orders o
     ON oi.order_id = o.id JOIN
     books b
     ON oi.book_id = b.id
WHERE o.status in (2, 3)
GROUP BY b.id
ORDER BY b.category_id, total_quantity DESC

您可以将此查询的结果加入product表。请使用您正在使用的RDBMS标记您的问题:mysql、oracle、sql server。。。?
SELECT DISTINCT ON (b.id), b.*, SUM(oi.quantity) as total_quantity
FROM order_items oi JOIN
     orders o
     ON oi.order_id = o.id JOIN
     books b
     ON oi.book_id = b.id
WHERE o.status in (2, 3)
GROUP BY b.id
ORDER BY b.category_id, total_quantity DESC