5

这是样本数据,尽可能归结为:

Table: items (id / manufacturer)
1 / Microsoft
2 / Microsoft
3 / Microsoft
4 / ACME
5 / Microsoft

Table: order_rows (item_id / date)
1 / 2012-12-01
1 / 2013-01-01
2 / 2013-01-02
2 / 2013-01-03
3 / 2013-01-04
3 / 2013-01-05
3 / 2013-01-06

我想要 Microsoft 的所有项目列表,按自 2013 年 1 月 1 日以来的购买次数排序。

因此,无论 Microsoft 的哪个项目在 order_rows 中日期 > 2013-01-01 的条目最多,都将是第一个。自 2013 年 1 月 1 日以来购买量为零的所有商品都将位于底部(不排除在列表之外)。

这可以通过单个查询来完成吗?另外,这会不会太贵而不实用?

所需的输出将按以下顺序排列:3、2、1、5

4

2 回答 2

3

您应该能够使用与此类似的东西来连接表,然后使用并按ORDER BY count(item_id) desc您想要的顺序获取数据:

select i.id, i.manufacturer
from items i
left join order_rows o
  on i.id = o.item_id
  and o.date > '2013-01-01'
where i.manufacturer  ='Microsoft'
group by i.id, i.manufacturer
order by count(o.item_id) desc;

请参阅带有演示的 SQL Fiddle

如果您只想要 ID,则可以manufacturer从 SELECT 和 GROUP BY 中删除:

select i.id
from items i
left join order_rows o
  on i.id = o.item_id
  and o.date > '2013-01-01'
where i.manufacturer  ='Microsoft'
group by i.id
order by count(o.item_id) desc;

请参阅带有演示的 SQL Fiddle

于 2013-05-08T21:17:11.420 回答
2

如果 order_rows 表有大量行,则查询可能会在性能方面有所帮助。

SELECT b.id, b.`manufacturer`, a.cnt AS num_orders
  FROM
       (
       SELECT item_id, COUNT(*) AS cnt
         FROM order_rows
        WHERE item_id IN (SELECT id FROM items WHERE manufacturer = 'Microsoft')
          AND date >= '2013-01-01'
        GROUP BY item_id
       ) a
 RIGHT OUTER JOIN items b
    ON a.item_id = b.id
 WHERE b.`manufacturer` = 'Microsoft'
 ORDER BY IFNULL(a.cnt, 0) DESC

这将产生如下结果:

在此处输入图像描述

请参阅SQL Fiddle的在线演示

于 2013-05-08T21:49:10.850 回答