2016-07-01 30 views
1

我想用不同数目的条目管理列表。目前我正在使用下面的表格结构。查找多行SQLite表中的重复项

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 

这会工作,但它似乎非常复杂。有更容易的方法吗?我也打算为我的列表使用另一个表结构。请告诉我你的想法。

非常感谢

回答

1

两个列表是相等的,如果

  1. sort_id的个数为相等的,如果
  2. 所有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); 
+0

**! ! !倒数第二行的右括号是错误的! ! !**但谢谢你的解决方案。我可以用它! –