抱歉,如果这重复了其他人的问题,但我已经研究了很长时间,但还没有找到解决方案。
我有两个表,todo_list
(其中包含一个 TODO 列表的列表)和task
(其中包含一个任务列表,每个都与一个 TODO 列表相关联)。
这是相关的结构:
待办事项列表
- ID
任务
- ID
- todo_list_id (与 todo_list 中的id相同)
- 已删除(为 0 或 1)
多个任务分配给每个 TODO 列表。我希望能够选择删除所有关联任务的 TODO 列表。我怎样才能做到这一点?
您可以使用仅指定未删除任务的连接条件进行左连接。然后,未连接的行将是那些没有任务的行deleted = 0
。
SELECT todo_list.* FROM todo_list
LEFT JOIN task ON todo_list.id = task.todo_list_id && task.deleted = 0
WHERE task.todo_list_id IS NULL
我认为这些类型查询的最佳方法是聚合:
select todo_list_id
from task t
group by todo_list_id
having sum(deleted) = count(*)
或者,替代having
条款是:
having max(case when deleted = 0 then 1 else 0 end) = 0
如果您尝试获取所有任务都已删除或取消删除的列表,则以下having
子句有效:
having min(deleted) <> max(deleted)
试试这个查询
select distinct tl.id, tName from todo_list tl, task t where
tl.id=t.todo_list_id and
tl.id not in (select todo_list_id from task where deleted =1);
注意:假设删除的记录的值为 0,如果它是 1,则在查询中将值更改为 0
http://sqlfiddle.com/#!2/01b27/9
希望这可以帮助