我有一个SQLite数据库,我正在采用软删除方法:
delete
字段。该字段可以设置为0(未删除)或1(删除)DELETE
查询转换为UPDATE
个查询,将删除标记设置为1 SELECT
查询,方法是添加AND delete = 0
条件以仅提取未删除的记录新数据库架构
这里是card
表:
+------------+---------+-----------+
| id | name | deleted |
+------------+---------+-----------+
这里是tag
表:
+------------+---------+-----------+
| id | name | deleted |
+------------+---------+-----------+
这里是cardtag
表:
+------------+---------+-----------+
| cardid | tagid | deleted |
+------------+---------+-----------+
cardtag.cardid
和cardtag.tagid
分别是card.id
和tag.id
正如您所看到的,cardtag
是将多个标签分配给卡片的经典关系表
查询我仍然需要修改
我设法将几乎所有查询移植到软删除方法(非常简单),除了以下内容:
查询以card.id
SELECT c.*, GROUP_CONCAT(ct.tagid) FROM cards as c LEFT JOIN cardtag as ct ON c.id = ct.cardid WHERE c.id = ? GROUP BY c.id;
应修改此查询,以便了解deleted
和tag
表格上的cardtag
标记并采取相应措施
通过提供[list_of_comma_separated_tag_ids]
来查询检索所有卡片和相关的标签列表SELECT c.*, GROUP_CONCAT(ct.tagid) FROM cards as c LEFT JOIN cardtag as ct ON c.id = ct.cardid LEFT JOIN tags as t ON t.id = ct.tagid AND t.id IN ([list_of_comma_separated_tag_ids]) GROUP BY c.id HAVING COUNT(ct.tagid) >= COUNT(t.id) AND COUNT(t.id) = [list_of_comma_separated_tag_ids.length] AND c.deleted = 0
应修改此查询,以便了解deleted
和tag
表格上的cardtag
标记并采取相应措施
最后一个查询的工作原理是查看提供的标签ID列表,并选择所有具有与之关联的标签的卡(当然,它们甚至可能有其他标签)。换句话说:查询选择所有至少具有输入
中提供的所有标记ID的卡片答案 0 :(得分:1)
您可以在1
部分
AND
第一次查询
JOIN
第二次查询
SELECT c.*, GROUP_CONCAT(ct.tagid) FROM cards as c LEFT JOIN cardtag as ct ON c.id = ct.cardid AND ct.deleted != 1 WHERE c.id = ? GROUP BY c.id;
答案 1 :(得分:1)
在查询中处理此问题的最简单方法是根本不更改查询,并创建使表格看起来像以前一样的views:
CREATE VIEW card_view AS SELECT id, name FROM card_actual WHERE deleted = 0;
(也可以在视图上创建INSTEAD OF DELETE triggers。)