복붙노트

[SQL] MySQL의에서 INTERSECT

SQL

MySQL의에서 INTERSECT

나는 두 테이블, 레코드와 데이터를 가지고있다. 기록은 여러 필드 (이름, 성 등)이있다. 각 필드는 실제 값이 저장되어있는 데이터 테이블의 외래 키이다. 여러 개의 레코드 필드에서 검색해야합니다.

다음은 INTERSECT를 사용하는 예제 쿼리는,하지만 난 MySQL의에서 작동 하나가 필요합니다.

SELECT records.id FROM records, data WHERE data.id = records.firstname AND data.value = "john"
INTERSECT
SELECT records.id FROM records, data WHERE data.id = records.lastname AND data.value = "smith"

어떤 도움을 주셔서 감사합니다.

해결법

  1. ==============================

    1.당신은 내부가 다른 테이블에서 일치하는 행이 행을 필터에 가입 사용할 수 있습니다 :

    당신은 내부가 다른 테이블에서 일치하는 행이 행을 필터에 가입 사용할 수 있습니다 :

    SELECT DISTINCT records.id 
    FROM records
    INNER JOIN data d1 on d1.id = records.firstname AND data.value = "john"
    INNER JOIN data d2 on d2.id = records.lastname AND data.value = "smith"
    

    많은 다른 대안 중 하나는 절에 있습니다 :

    SELECT DISTINCT records.id 
    FROM records
    WHERE records.firstname IN (
        select id from data where value = 'john'
    ) AND records.lastname IN (
        select id from data where value = 'smith'
    )
    
  2. ==============================

    2.나는이 방법을 따라 훨씬 쉽게 생각하지만, 당신이 처음에 중복 레코드를 많이 실어 때문에 그것과 관련된 약간의 오버 헤드가있다. 나는 10000-50000에 대한 기록과 일반적으로 교차 5에 대한 쿼리를 데이터베이스에 그것을 사용하고 성능이 허용됩니다.

    나는이 방법을 따라 훨씬 쉽게 생각하지만, 당신이 처음에 중복 레코드를 많이 실어 때문에 그것과 관련된 약간의 오버 헤드가있다. 나는 10000-50000에 대한 기록과 일반적으로 교차 5에 대한 쿼리를 데이터베이스에 그것을 사용하고 성능이 허용됩니다.

    당신이 모든 "UNION ALL"당신이 교차하고 모든 시간을 가지고 어떤 것들을보고 싶은 쿼리의 각이다.

    SELECT * From (
    
        (Select data1.* From data1 Inner Join data2 on data1.id=data2.id where data2.something=true)
        Union All
        (Select data1.* From data1 Inner Join data3 on data1.id=data3.id where data3.something=false)
    
    ) As tbl GROUP BY tbl.ID HAVING COUNT(*)=2 
    

    우리는 두 쿼리에서 동일한 레코드를 가져 그래서 경우의 수는 2되며 최종 랩 어라운드 쿼리가 포함됩니다.

  3. ==============================

    3.사용 대신 조인

    사용 대신 조인

    SELECT records.id
    FROM records
    JOIN data AS D1 ON records.firstname = D1.id
    JOIN data AS D2 ON records.lastname = D2.id
    WHERE D1.value = 'john' and D2.value = 'smith'
    

    다음은 몇 가지 테스트 데이터는 다음과 같습니다

    CREATE TABLE records (id INT NOT NULL, firstname INT NOT NULL, lastname INT NOT NULL);
    INSERT INTO records (id, firstname, lastname) VALUES
    (1, 1, 1),
    (2, 1, 2),
    (3, 2, 1),
    (4, 2, 2);
    
    CREATE TABLE data (id INT NOT NULL, value NVARCHAR(100) NOT NULL);
    INSERT INTO data (id, value) VALUES
    (1, 'john'),
    (2, 'smith');
    

    예상 결과:

    2
    

    테스트 데이터는 아마도 포스터 유용하지 않습니다,하지만 그들은 제대로 작동하거나 자신의 답변을 테스트 할 수 있도록 원하는 사람들이 답변을 제출하는 것을 볼 수있는 솔루션을 확인하려는 유권자 유용 할 수 있습니다.

  4. ==============================

    4.MYSQL에서 INTERSECT에 대한 일반적인 교체 내부 조인 :

    MYSQL에서 INTERSECT에 대한 일반적인 교체 내부 조인 :

    SELECT DISTINCT * FROM 
    (SELECT f1, f2, f3... FROM table1 WHERE f1>0)
    INNER JOIN
    (SELECT f1, f2, f3... FROM table2 WHERE f1>0)
    USING(primary_key)
    

    아니면 경우에 특히 :

    SELECT DISTINCT * FROM 
    (SELECT records.id FROM records, data WHERE data.id = records.firstname AND data.value = "john") query1
    INNER JOIN
    (SELECT records.id FROM records, data WHERE data.id = records.lastname AND data.value = "smith") query2
    USING (id)
    
  5. ==============================

    5.SELECT는 NOT EXISTS 테이블 t t.id FROM (SELECT는 t2.id를 표 2 FROM WHERE t2.id T2 = t1.id)

    SELECT는 NOT EXISTS 테이블 t t.id FROM (SELECT는 t2.id를 표 2 FROM WHERE t2.id T2 = t1.id)

    https://dev.mysql.com/doc/refman/5.7/en/exists-and-not-exists-subqueries.html

  6. ==============================

    6.MySQL의 교차를 지원하지 않기 때문에, 당신은이 개 대안이있을 수 있습니다 : 내부 조인과에이에있는 솔루션입니다. :

    MySQL의 교차를 지원하지 않기 때문에, 당신은이 개 대안이있을 수 있습니다 : 내부 조인과에이에있는 솔루션입니다. :

    SELECT records.id FROM records, data 
    WHERE data.id = records.firstname AND data.value = "john"
        AND records.id in (SELECT records.id FROM records, data 
        WHERE data.id = records.lastname AND data.value = "smith);
    
  7. from https://stackoverflow.com/questions/2300322/intersect-in-mysql by cc-by-sa and MIT license