首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL:对"WHERE IN“列表中未找到的项返回0的计数

MySQL:对"WHERE IN“列表中未找到的项返回0的计数
EN

Stack Overflow用户
提问于 2021-05-11 05:23:21
回答 2查看 49关注 0票数 0

我有一个页面,列出100个拍卖,我想显示每个项目的出价数量。到目前为止(在本例中仅使用4次拍卖),如下所示:

代码语言:javascript
复制
SELECT itemid, COUNT(*) as count FROM bids WHERE itemid IN(487359,487342,487339,487338) GROUP BY itemid

这显示了出价的数量..。但是,只有在出价表中确实存在出价(和itemid)的情况下。没有出价的项目将不会在投标表中有一个项目。如何为这些返回"0“计数?

我试过以下几种方法,但它们也不起作用:

代码语言:javascript
复制
IFNULL(COUNT(*),0) and COLEASCE(COUNT(*),0)

更新

以下是一些示例数据:

投标表

itemid _ bid _

487359 / 1.00

487359 / 2.00

487359 / 2.50

487342 / 8.20

487338 / 1.00

实际发生了什么:

itemid #投标

487359 x-3

487342 x-1

487338 x-1

我想要的是:

itemid #投标

487359 x-3

487342 x-1

487339 x-0

487338 x-1

请注意,在拍卖表中找不到"487339“项,因为没有记录该项目的出价。我希望mysql为这些返回0。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-11 06:41:17

这可以用OUTER JOIN来完成。

代码语言:javascript
复制
SELECT i.id as itemid, COUNT(DISTINCT b.id) as count
  FROM items i LEFT OUTER JOIN bids b ON i.id = b.itemid
 WHERE i.id IN (487359, 487342, 487339, 487338)
 GROUP BY i.id

这将始终返回指定的项目-只要记录存在-和一个0,如果没有找到出价。由于正在使用OUTER JOIN,如果需要向投标添加任何筛选条件,请确保将其添加到带有ANDOUTER JOIN中。不要添加bids标准到WHERE,否则您的OUTER JOIN将被视为一个INNER JOIN,删除所有记录与0出价。

票数 1
EN

Stack Overflow用户

发布于 2021-05-11 05:28:20

您可以在这里使用条件求和:

代码语言:javascript
复制
SELECT
    itemid,
    SUM(itemid IN (487359, 487342, 487339, 487338, ...)) AS count
FROM bids
GROUP BY
    itemid;

但是,更好的方法,特别是如果itemid的列表很长,应该将这些值放在单独的表items中,然后使用bids进行左连接。

代码语言:javascript
复制
SELECT
    b.itemid,
    COUNT(i.itemid) AS count
FROM bids b
LEFT JOIN items i            -- contains 487359, 487342, 487339, 487338, ...
    ON i.itemid = b.itemid
GROUP BY
    b.itemid;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67480977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档