2014-02-11 2 views
0

의 한 행에서 여러 행을 선택MySQL은 내가이 상황이 2 개 개의 다른 테이블

Table A (Ex. Dog's name): 
ID | Name 
1 | Nabu 
2 | Lapo 
3 | Kim 
3 | Bau 

Table B (Ex. Dog's characteristics): 
ID | AID | BID | BV 
1 | 1 | 1 | 1 
2 | 1 | 2 | 1 
3 | 1 | 3 | 0 
4 | 2 | 1 | 1 
5 | 2 | 2 | 0 
6 | 2 | 3 | 1 
7 | 3 | 1 | 0 
8 | 3 | 2 | 1 
9 | 3 | 3 | 1 
10 | 4 | 1 | 1 
11 | 4 | 2 | 1 
12 | 4 | 3 | 1 

나는 A가 B 특성 필드

예를 사용에서 "정확한 검색"을 확인해야합니다.

(BID = 1 && BV = 1) AND (BID = 2 && BV = 1) have to return A.ID = 1 & 4 
(BID = 1 && BV = 0) AND (BID = 2 && BV = 1) have to return A.ID = 3 

어떻게 하나 이하의 쿼리에서 각각의 특성과 비교를 할 수 있습니까?!

감사합니다.

+0

검색어가 하나 미만입니까? – Strawberry

+0

개 하나씩 별도로 쿼리 개 특성! 또는 각 개마다 특성을 확인하고 정답을 검색해야합니다! – DigitalDaigor

답변

1

당신은 집계하고 having 절을 사용하여이 작업을 수행 할 수 있습니다

select AID 
from table B 
group by AID 
having sum(BID = 1 AND BV = 1) > 0 and 
     sum(BID = 2 AND BV = 1) > 0; 

having 절에 각 조건은 조건 중 하나를 충족 행의 수를 계산합니다. 당신의 논리는 모두 존재하는 것이 필요하므로 행의 수는 그 자체에 테이블을 결합하면 더 큰 0보다

2

을 할 필요가 :

SELECT A.id FROM A 
LEFT JOIN B as B1 on A.ID = B1.AID 
LEFT JOIN B as B2 on A.ID = B2.AID and B1.ID != B2.ID 
WHERE 
(B1.BID = 1 && B1.BV = 1) AND (B2.BID = 2 && B2.BV = 1) 

당신이 곳의 모든 행을 찾을 수 있어야합니다 B.ID가 다른 B에서 두 개의 일치하는 항목이 있습니다.

+0

정말 대단합니다. 테스트 시작을 잊어 버립니다. 감사! – DigitalDaigor

+0

흥미롭게도이 솔루션에는 실제로 문제가 있습니다. 일치하는 두 ID 중 낮은 값만 반환합니다. 또는 어쩌면 내가 첫 번째 쿼리에 대해 반환되는 1과 4에 대한 논리를 이해하지 못할 수도 있습니다. 바라건대 아이디어 자체가 도움이되기를 바랍니다. – ModulusJoe

+0

"및 B1.ID DigitalDaigor