我想管理包含各种条目的列表。目前我使用的是以下表结构。
CREATE TABLE lists (
list_id INTEGER,
sort_id INTEGER,
content_id INTEGER,
PRIMARY KEY (list_id,sort_id)
)
所以我可以使用以下方式调用个人列表:
SELECT content_id WHERE list_id=<<X>> ORDER BY sort_id
原则上添加新列表不是问题,但如何在插入新的列表集之前检查完整列表的重复项?我举个例子:
已插入以下列表:
list_id | sort_id | content_id
--------+---------+-----------
3 | 1 | 7
3 | 2 | 4
3 | 3 | 9
包含内容7,4,9的新列表将是重复的,不得插入。但由于我对不同的列表内容的定义,内容4,7,9或7,4或7,4,9,5必须是插入的。
我想添加一个新表,其中包含列表的连接内容,如:
CREATE TABLE lists_concat (list_id PRIMARY KEY, content_concat UNIQUE)
因此,对于我的例子,将有条目
list_id | content_concat
--------+---------------
3 | 7,4,9
这可行,但似乎非常复杂。有没有更简单的方法?我也愿意为我的列表使用另一个表结构。请告诉我你的想法。
非常感谢
答案 0 :(得分:1)
如果
,则两个列表相等sort_id
s的数量相等,如果sort_id
匹配的值,即没有匹配sort_id
但不同值的行。假设新列表存储在单独的表中:
CREATE TEMPORARY TABLE new_list ( sort_id, content_id );
您可以搜索以下重复项:
SELECT list_id
FROM (SELECT DISTINCT list_id
FROM lists) AS L1
WHERE (SELECT COUNT(*)
FROM lists as L2
WHERE L2.list_id = L1.list_id
) =
(SELECT COUNT(*)
FROM new_list
)
AND NOT EXISTS (SELECT 1
FROM lists AS L3
JOIN new_list ON L3.list_id = L1.list_id
AND L3.sort_id = new_list.sort_id
WHERE L3.content_id != new_list.content_id);