2016-07-01 9 views
1

Ich möchte Listen mit einer unterschiedlichen Anzahl von Einträgen verwalten. Zur Zeit verwende ich die folgende Tabellenstruktur.Suchen nach Duplikaten in SQLitentabelle mit mehreren Zeilen

CREATE TABLE lists (
    list_id INTEGER, 
    sort_id INTEGER, 
    content_id INTEGER, 
    PRIMARY KEY (list_id,sort_id) 
) 

So kann ich eine individuelle Anrufliste verwenden:

SELECT content_id WHERE list_id=<<X>> ORDER BY sort_id 

Im Prinzip eine neue Liste hinzuzufügen ist kein Problem, aber wie kann ich überprüfen, nach Duplikaten einer vollständigen Liste, bevor Sie einen neuen Satz einfügen einer Liste? Ich gebe ein Beispiel:

Es gibt die folgende Liste bereits eingefügt:

list_id | sort_id | content_id 
--------+---------+----------- 
    3 | 1 |  7 
    3 | 2 |  4 
    3 | 3 |  9 

Eine neue Liste mit dem Inhalt 7,4,9 wäre ein Duplikat sein und nicht eingesetzt werden muß. Aber der Inhalt 4,7,9 oder 7,4 oder 7,4,9,5 muss aufgrund meiner Definition eines anderen Listeninhalts eingefügt werden.

Ich dachte an eine neue Tabelle hinzu, dass enthält den verketteten Inhalt einer Liste, so etwas wie:

CREATE TABLE lists_concat (list_id PRIMARY KEY, content_concat UNIQUE) 

Also für mein Beispiel wäre es den Eintrag

list_id | content_concat 
--------+--------------- 
    3 |  7,4,9 

Dies würde funktionieren , aber es scheint sehr kompliziert zu sein. Gibt es einen leichteren Weg? Ich bin auch offen, um eine andere Tabellenstruktur für meine Listen zu verwenden. Erzähl mir bitte über deine Ideen.

Vielen Dank

Antwort

1

Zwei Liste sind gleich, wenn

  1. die Zahl der sort_id s gleich, und wenn
  2. die Werte für alle sort_id s Spiel, also gibt es keine Zeilen mit passend sort_id s aber unterschiedliche Werte.

die neue Liste Angenommen wird in einer separaten Tabelle gespeichert:

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

**:

CREATE TEMPORARY TABLE new_list (sort_id, content_id); 

Sie nach Duplikaten wie diese suchen! ! ! Die rechte Klammer der vorletzten Zeile ist falsch! ! ! ** Aber danke für die Lösung. Ich kann das benutzen! –

Verwandte Themen