SQLite COUNT和LEFT JOIN - 如何结合?

时间:2013-05-01 19:04:55

标签: sql sqlite

有两个表:一个(P)包含产品列表,另一个(H)包含消费产品的历史记录。每种产品可以消耗0次或更多次。我需要构建一个查询,它将返回P中的所有产品以及每个产品消耗的次数,并按消耗的时间排序。这是我做的:

SELECT P.ID, P.Name, H.Date, COUNT(H.P_ID) as Count 
FROM P 
LEFT JOIN H 
  ON P.ID=H.P_ID  
ORDER BY Count DESC

这似乎仅在历史表包含数据时有效,但如果不包含 - 结果不正确。我做错了什么?

1 个答案:

答案 0 :(得分:9)

您需要group by才能获得所需的计数。您还需要将聚合函数应用于H.Date,否则不清楚选择哪个日期:

SELECT P.ID, P.Name, COUNT(H.P_ID) as Count, MAX(H.Date) as LastDate
FROM P 
LEFT JOIN H ON P.ID=H.P_ID
GROUP BY P.ID, P.Name
ORDER BY Count DESC

我选择MAX(H.Date)来生成上次消费的日期;如果您需要与H不同的日期,请更改聚合函数。

我不确定sqlite是否允许您按别名排序;如果没有,请替换

ORDER BY Count DESC

ORDER BY COUNT(H.P_ID) DESC