sql - 选择引用行的唯一计数

标签 sql postgresql select

高级:

我有 list , list 有 list 项目。我想获得已完成的 list 的数量。具体来说,有 list 项目但全部完成的 list 。

表格:

Table "checklists"

|     Column   |          Type          |
+--------------+------------------------+
| id           | integer                |
| name         | character varying(255) |

Table "checklist_items"

|     Column   |          Type          |
+--------------+------------------------+
| id           | integer                |
| completed    | boolean                |
| name         | character varying(255) |
| checklist_id | integer                |

问题: 什么查询会给我完成的 list 计数?具体来说,要小心排除包含完整和不完整 list 项目的 list 以及没有 list 项目的 list 。

到目前为止已尝试:

SELECT DISTINCT COUNT(DISTINCT "checklists"."id")
  FROM "checklists"
INNER JOIN "checklist_items" ON "checklist_items"."checklist_id" = "checklists"."id"
  WHERE "checklist_items"."completed" = 't'

这个问题的问题是它不排除部分完成的 list 。

最佳答案

更快,但:

SELECT count(DISTINCT i.checklist_id)
FROM   checklist_items i
LEFT   JOIN checklist_items i1 ON i1.checklist_id = i2.checklist_id
                              AND i.completed IS NOT TRUE
WHERE i.completed
AND   i1.checklist_id IS NULL;

这只会收集存在已完成项目的 list 。
并排除那些存在另一个未完成的 checklist_item(FALSENULL)。

关于sql - 选择引用行的唯一计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16242245/

相关文章:

mysql - 为什么这个 SQL INNER JOIN 有效而这个无效?

mysql - SQL IN 子句 - 取回不匹配的 IN 元素

sql - PostgreSQL 中的条件累积平均

mysql - 如何使此查询以相反的顺序从另一个表中获取一些数据

mysql - 如何在mysql中更新一个char类型的列来增加它的长度

php - 多个值插入mysql数据库表

sql - 从 JSONB 列中按键选择不同的值

sql - Postgres 检查列名是否有效

c - 当你有 UDP 套接字时如何使用 select 函数

mysql - 选择并计算同一查询中的行?