2016-07-01 22 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

**! ! !倒數第二行的右括號是錯誤的! ! !**但謝謝你的解決方案。我可以用它! –