2016-07-01 5 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가 삽입되어야합니다. 그래서 내 예를 들어 항목을

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

이 일하는 것이있을 것

CREATE TABLE lists_concat (list_id PRIMARY KEY, content_concat UNIQUE) 

:

나는 새 테이블을 추가하는 생각, 즉 같은 연결된 목록의 내용, 뭔가를 포함 , 그러나 그것은 매우 복잡해 보입니다. 더 쉬운 방법이 있습니까? 또한 목록에 다른 테이블 구조를 사용하도록 열려 있습니다. 너의 생각을 말해줘.

덕분에 많은

답변

1

두 목록은 동일

  1. 경우 sort_id의 수는 동일하고, 즉, 모든 sort_id의 일치에 대한
  2. 값은 어떤 행이없는 경우 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

를 **! ! ! 마지막 줄의 오른쪽 괄호가 잘못되었습니다! ! ! **하지만 해결책을 가져 주셔서 감사합니다. 나는 그것을 사용할 수있다! –

관련 문제