2010-05-20 2 views
3

을 (의 사용)는 제외 나는이라는 테이블 '국가'많은 관계로 많은으로 다른 테이블 '네트워크'에 연결 :의 NETWORK_ID을 (를) 가지고있는 모든 국가를 검색하려면SQL SELECT 다른

countries    countries_networks    networks 
+-------------+----------+ +-------------+----------+ +-------------+---------------+ 
| Field  | Type  | | Field  | Type  | | Field  | Type   | 
+-------------+----------+ +-------------+----------+ +-------------+---------------+ 
| id   | int(11) | | id   | int(11) | | id   | int(11)  | 
| countryName | char(35) | | country_id | int(11) | | name  | varchar(100) | 
+-------------+----------+ | network_id | int(11) | | description | varchar(255) | 

6 & 7, 난 그냥 다음을 수행하십시오. (나는 networks.name를 사용하는 것이 더 갈 수 있지만이 countries_networks.network_id 그래서 난 그냥 SQL을 줄이기 위해 사람들을 사용 알)

SELECT DISTINCT countryName 
FROM countries AS Country 
INNER JOIN countries_networks AS n ON Country.id = n.country_id 
WHERE n.network_id IN (6,7) 

이 괜찮하지만, 그런 다음 network_id가 JUST 8 인 국가를 검색하고 다른 국가는 검색하지 않습니다.

나는 다음을 시도했지만 여전히7 인치의 네트워크를 가지고있다. 내 JOIN과 관련이 있는가?

SELECT DISTINCT countryName 
FROM countries AS Country 
INNER JOIN countries_networks AS n ON Country.id = n.country_id 
WHERE n.network_id IN (8) 
AND n.network_id not IN(6,7) 

감사합니다. 당신이 필요

답변

2

조인 : 일들이 모두가 당신이 당신의 마지막 줄에 체크되어, 쿼리에 서

SELECT DISTINCT c.CountryName 
FROM Countries c 
     INNER JOIN 
       countries_networks n 
       ON c.id = n.country_id 
       AND n.network_id = 8 
     LEFT JOIN 
       countries_networks n2 
       ON c.id = n2.country_id 
       AND n2.network_id IN (6, 7) 
WHERE n2.country_id IS NULL 

으로 8 목록에없는 것입니다 (6, 7). 귀하의 질문을 바로 읽으면 ID가 8 인 네트워크가 있지만 ID가 6 또는 7 인 네트워크가 필요합니다. 각각 자체 조인이 필요하며 일치하는 네트워크가 없는지 확인하고 싶습니다 두 번째 행 당신은 하위 쿼리를 할 수

1
SELECT countryName 
FROM countries 
WHERE country_id IN 
     (
     SELECT country_id 
     FROM network 
     WHERE network_id = 8 
     ) 
     AND country_id NOT IN 
     (
     SELECT country_id 
     FROM network 
     WHERE network_id IN (6, 7) 
     ) 
0

이 비록

SELECT DISTINCT c.countryName 
FROM countries AS c 
INNER JOIN countries_networks AS n ON c.id = n.country_id 
WHERE n.network_id IN (8) 
AND c.countryName NOT IN 
    (SELECT c2.countryName FROM countries AS c2 
    INNER JOIN countries_networks AS n2 
    WHERE n2.network_id IN (6,7)) 

최적이 아닐 수 있습니다.

0

네트워크 ID가 6 및 7 인 국가를 얻는 이유는 각 countries_networks 레코드에서 조건을 확인하기 위해서입니다. 6과 7을 제외하는 조건의 일부는 전혀 영향을 미치지 않습니다. 8의 ID는 동시에 6이나 7이 될 수 없기 때문입니다. 당신이 국가 제외 할 국가를 포함 하나를 사용 하나 수 있도록

당신은 두 번 countries_networks 테이블에 가입해야합니다 또한

select countryName 
from countries c 
inner join countries_networks i on i.country_id = c.id and i.network_id = 8 
left join countries_networks e on e.country_id = c.id and e.network_id in (6,7) 
where e.id is null 

을, 당신은하지 않는 한,이 쿼리를 구별 할 필요가 없습니다 실제로는 동일한 국가와 네트워크 ID 사이에 여러 개의 연결이 있습니다.

+0

... 내가 5 ~ 6 분 전에 쓴 것입니다. –

2

NOT EXISTS 술어를 사용하는 또 하나의 솔루션. 당신이 추가가 networks 테이블에 가입 저항하고 있지만

SELECT DISTINCT countryName 
FROM countries AS Country 
INNER JOIN countries_networks AS n ON Country.id = n.country_id 
WHERE n.network_id IN (8) 
AND NOT EXISTS (SELECT 1 FROM countries_networks n1 
    WHERE n1.country_id = Country.id AND n1.network_id !=8) 
0

, 그것은 정말 간단한 방법입니다. 해당 테이블에 대해 귀하의 ID를 테스트하는 경우, 결과는 적절하게 제한해야합니다

SELECT countryName 
    FROM countries AS Country JOIN countries_networks AS cn 
           ON Country.id = cn.country_id 
          JOIN networks n 
           ON cn.network_id = n.id 
WHERE n.network_id IN (8) 

테스트를 networks 테이블에 대해 countries_networks 표에 연결될 수 있습니다 아무것도에 관계없이 결과를 제한해야합니다. 또한 하위 쿼리 또는 내가 생각할 수있는 다른 솔루션보다 성능이 뛰어나다.