MySQL에서 교차
나는 두 개의 테이블과 기록과 데이터를 가지고 있다.레코드에는 여러 필드(이름, 성 등)가 있습니다.이러한 각 필드는 실제 값이 저장되는 데이터 테이블의 외부 키입니다.여러 레코드 필드를 검색해야 합니다.
아래는 CRESST를 사용한 쿼리 예시입니다만, 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"
도와주셔서 감사합니다.
내부 결합을 사용하여 다른 테이블에 일치하는 행이 있는 행을 필터링할 수 있습니다.
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"
다른 많은 대안 중 하나는in
절:
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'
)
이 방법이 훨씬 쉽다고 생각합니다만, 처음에는 중복 레코드가 많이 로드되어 있기 때문에 오버헤드가 조금 발생합니다.약 10,000~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가 되며 최종 랩어라운드 쿼리에 포함됩니다.
대신 조인 사용:
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
테스트 데이터는 포스터에는 유용하지 않을 수 있지만 솔루션이 올바르게 작동하는지 확인하려는 유권자나 자신의 답변을 테스트하기 위해 답변을 제출하려는 사람들에게 유용할 수 있습니다.
파티에 조금 늦었지만 가장 깔끔하고 좋은 방법은INTERSECT
다음과 같습니다.
SELECT * FROM
( SELECT records.id FROM records, data WHERE data.id = records.firstname AND data.value = "john" ) x1
NATURAL JOIN
( SELECT records.id FROM records, data WHERE data.id = records.lastname AND data.value = "smith" ) x2
MYSQL에서 CRESS를 대체하는 일반적인 방법은 내부 결합입니다.
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)
SELECT t.id FROM table t WHERE NOT EXISTS (SELECT t2.id, FROM table2 t2 WHERE t2.id = t1.id)
https://dev.mysql.com/doc/refman/5.7/en/exists-and-not-exists-subqueries.html
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);
언급URL : https://stackoverflow.com/questions/2300322/intersect-in-mysql
'programing' 카테고리의 다른 글
file_get_contents()에는 타임아웃 설정이 있습니까? (0) | 2022.09.22 |
---|---|
AES_Decrypt()가 늘 값을 반환합니다. (0) | 2022.09.22 |
선과 수평축 사이의 각도는 어떻게 계산하나요? (0) | 2022.09.22 |
Laravel DB:select()는 그룹 내의 모든 열을 다음과 같이 요구합니다. (0) | 2022.09.22 |
WordPress 게시물의 피처 이미지 URL을 얻는 방법 (0) | 2022.09.22 |