2009-10-13 5 views
0

데이터를 포함하는 테이블 "T"가 아래가 표시됩니다으로 고유 값을 얻기 :MySQL의 쿼리

A B 
--------- 
3 5 
4 6  
7 10 
8 5 
9 12 
3 6 
3 7 
8 7 

는 A의 값으로 {3,8}의 설정 주어진 입력을 가정하는 방법을 모두 검색 할 입력 집합의 모든 값에 항목이있는 B의 고유 값?

B 
--- 
5 
7 

편집 : 질문이 명확하지 않다고 생각합니다. 주어진 집합의 모든 값을 가진 레코드가 A 열의 값으로 사용되는 B의 값을 원합니다. 따라서 A = 8 및 B = 6 인 레코드가 없기 때문에 B = 6은 포함되지 않습니다. 희망이 명확하게!

답변

5
SELECT DISTINCT B 
FROM my_table WHERE A IN (3,8) 

편집 :

SELECT B FROM AB WHERE A = 3 
INTERSECT 
SELECT B FROM AB WHERE A = 8 

INTERSECT는 당신에게 두 결과 집합에서 발생하는 열을 제공합니다.

2 편집 :

SELECT B,COUNT(B) 
FROM AB WHERE A IN (3,8) 
GROUP BY B 
HAVING COUNT(B) = 2 

당신은 그러나 두 곳에서이를 수정해야합니다 : IN 인수 및 끝에, COUNT에서 (B) =?. ? 인수의 수와 같아야합니다. 이것이 도움이되기를 바랍니다.

3 편집 :

SELECT B,COUNT(B) 
FROM 
(
    SELECT DISTINCT A, B FROM AB 
) x 
WHERE A IN (3,8) 
GROUP BY B 
HAVING COUNT(B) = 2 

이 중복 된 항목 문제를 방지 할 수 있습니다.

+1

1 : 짧고 달콤한. "IN"연산자는 많은 많은 문제를 해결합니다. WHERE 절은 "WHERE (A = '3'또는 A = '8')"로 쓰여질 수 있지만 IN을 사용하면 명확하고 읽기 쉽고 간결합니다. – Satanicpuppy

+0

제 편집을 확인하십시오. 내 예상 결과가 다릅니다. –

+0

지금 봅니다. 그게 더 분명해. –

0

기본적으로 일치시킬 후보 행을 필터링하여 두 개의 하위 쿼리를 만들 수 있습니다 (예 : A는 3 또는 8 중 하나임). 그런 다음 해당 행을 B 값으로 서로 결합하십시오. 일치하는 행이 사용자가 찾고자하는 행입니다. 나는 MySQL을위한 구문의 100 % 확실하지 않다,하지만 난이 일 것으로 예상 :

SELECT * FROM (SELECT * FROM T WHERE A = 3) t3 INNER JOIN (SELECT * FROM T WHERE A = 8) t8 ON t3.B = t8.B