首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列出所有表元素和count(),即使count为0也是如此

列出所有表元素和count(),即使count为0也是如此
EN

Stack Overflow用户
提问于 2018-07-18 06:09:53
回答 2查看 18关注 0票数 0

假设下表:

代码语言:javascript
复制
table book(
  id,
  title,
  deleted
)
table invoice(
  id,
  book_id,
  settled
)

我需要一份所有书的清单,以及每本书的结算发票数量。

我试过这个:

代码语言:javascript
复制
select book.id, title, count(invoice.id)
from book LEFT OUTER JOIN invoice ON book.id=invoice.book_id
where deleted=0
    and settled=1
group by book.id

只有当一本书至少有一张已结算的发票,或者根本没有任何发票时,这才有效。然而,当账簿有未结算的发票,并且没有任何已结算的发票时,它就会失败。

你知道怎么查询它吗?

EN

回答 2

Stack Overflow用户

发布于 2018-07-18 06:16:09

下面将列出所有帐簿,但仅连接和计算已结算的发票。

代码语言:javascript
复制
SELECT 
    b.id, b.title, COUNT(i.id) AS settled
FROM 
    book b
LEFT JOIN invoice i
    ON b.id = i.book_id 
    AND i.settled = 1
WHERE 
    b.deleted = 0
GROUP BY
    b.id
票数 2
EN

Stack Overflow用户

发布于 2018-07-18 06:14:39

WHERE上的condition and settled = 1有效地将您的LEFT JOIN变成了INNER JOIN。您可以向COUNT中添加CASE表达式

代码语言:javascript
复制
SELECT  b.id, 
        b.title, 
        COUNT(CASE WHEN i.settled = 1 THEN 1 END)
FROM book b
LEFT JOIN invoice i
    ON b.id = i.book_id
WHERE b.deleted=0
GROUP BY b.id;

或者使用已过滤发票表的LEFT JOIN

代码语言:javascript
复制
SELECT  b.id, 
        b.title, 
        COUNT(i.id)
FROM book b
LEFT JOIN ( SELECT *
            FROM invoice
            WHERE settled = 1) i
    ON b.id = i.book_id
WHERE b.deleted=0
GROUP BY b.id;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51390863

复制
相关文章

相似问题

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