获取postgresql中投票计数最小(包括0)的项

获取postgresql中投票计数最小(包括0)的项,sql,postgresql,Sql,Postgresql,我正在从事一个项目,在这个项目中,我需要获得投票数最少的两个项目,其中我有两个表:一个项目表和一个投票表,其中forgienkey为ItemId 我有一个疑问: SELECT id FROM ( SELECT "ItemId" AS id, count("ItemId") AS total FROM "Votes" WHERE "ItemId" IN ( SELECT id FROM "Items" WHERE date("Items"."createdAt

我正在从事一个项目,在这个项目中,我需要获得投票数最少的两个项目,其中我有两个表:一个项目表和一个投票表,其中forgienkey为ItemId

我有一个疑问:

SELECT id FROM (
SELECT "ItemId" AS id, 
count("ItemId") AS total
FROM "Votes" 
WHERE "ItemId" IN (
        SELECT id FROM "Items" 
        WHERE date("Items"."createdAt") = date('2015-05-26 18:30:00.565+00')
        AND "Items"."region" = 'west'
        )
GROUP BY "ItemId" ORDER BY total LIMIT 2
) x;
这在某些方面是可以的,但它不包括计数为null或0的项。有更好的方法吗

谢谢。如果你需要更多信息,请告诉我


Postgresql:9.4

类似的东西应该可以工作:

SELECT id,
coalesce((SELECT count(*) FROM "Votes" WHERE "ItemId" = "Items".id), 0) as total
FROM "Items"
WHERE date("Items"."createdAt") = date('2015-05-26 18:30:00.565+00')
AND "Items"."region" = 'west'
ORDER BY total LIMIT 2

如果某个项目未被投票,那么“投票”表将不会为其返回任何内容,因此主查询根本不显示该项目

您需要从“Items”中进行选择,然后将
左键连接到按“ItemId”和投票计数分组的“投票”。这样,所有项目都将得到考虑,也包括那些没有投票的项目。使用
coalesce()
函数将
NULL
s转换为
0

SELECT "Items".id, coalesce(x.total, 0) AS cnt
FROM "Items"
LEFT JOIN (
  SELECT "ItemId" AS id, count("ItemId") AS total
  FROM "Votes"
  GROUP BY "ItemId") x USING (id)
WHERE date("Items"."createdAt") = '2015-05-26'::date
  AND "Items"."region" = 'west'
ORDER BY cnt
LIMIT 2;

您的架构和至少一些示例数据可能会有所帮助。Patrick,我收到一个错误:“FROM中的子查询必须具有别名第3行:左联接。”('Alias出现在
USING
子句之前。答案已更正。这非常有效。alexius的答案也是如此。我觉得alexius必须快速,因为没有左连接。这并没有解决空\0问题。没有投票的项目将不会显示。哎呀,忘记删除分组依据。添加了合并,但没有它也可以工作。这看起来很棒。谢谢