2016-11-03 2 views
0

'business_id'및 'city_id'라는 두 개의 테이블을 'business'및 'cities'뿐만 아니라 두 개의 필드가있는 'associations'라는 세 번째 다 대다 관계 테이블을 포함하는 데이터베이스가 있습니다. '. 한 비즈니스는 여러 도시를 포괄 할 수 있으며 한 도시는 여러 비즈니스로 포괄 될 수 있습니다.SQL 쿼리는 단일 관계를 기반으로하는 다 대다 관계를 고갈 중입니까?

이제는 각 사업체를 관련된 도시와 함께 나열하고 싶습니다. 이렇게 :

SELECT 
    businesses.rowid, 
    businesses.name, 
    GROUP_CONCAT(cities.name, ', ') as citylist 
FROM businesses 
JOIN associations ON businesses.rowid = associations.business_id 
JOIN cities ON cities.rowid = associations.city_id 
GROUP BY businesses.rowid 

그리고 이것은 완벽하게 작동합니다. 그러나 제가 실제로하고 싶은 일은 주어진 도시와 관련된 비즈니스를 정확히 똑같은 방법으로 나열하는 것입니다. 그러나이 방법을 찾지 못했지만 GROUP_CONCAT(cities.name, ', ')은 모든 도시가 연결된 대신 지정된 도시 만 반환합니다. 그것이이 나는 현재 SQLite는 3를 사용하고 솔루션에 대한 중요한 경우

0: [rowid] = 42 
    [name] = Generic Business 
    [citylist] = New York, Jamestown, Albany 
1: [rowid] = 31 
    [name] = Arbitrary Ltd. 
    [citylist] = Fulton, New York, Lockport 

하지만, I : 도시 "뉴욕"주어진 경우

는 임의의 예로서,이 같은 결과를 원하는 것 필요한 경우 변경하는 것에 완전히 반대하지 않습니다.

답변

1

having 절을 사용하십시오.

SELECT b.rowid, b.name, 
     GROUP_CONCAT(c.name, ', ') as citylist 
FROM businesses b JOIN 
    associations a 
    ON b.rowid = a.business_id JOIN 
    cities c 
    ON c.rowid = a.city_id 
GROUP BY b.rowid, b.name 
HAVING SUM(CASE WHEN c.name = 'New York' THEN 1 ELSE 0 END) > 0; 

주 :

  • 테이블 별명을합니다 (a, bc)는 쓰기와 읽기 쿼리가 쉽게합니다.
  • 명확한 목적을 위해 SELECT의 모든 집계되지 않은 열을 GROUP BY에 두는 것을 선호합니다.
+0

고맙습니다. 완벽하게 작동합니다. :) 한 가지 작은 점은 질문에 영어로 테이블 이름을 번역 할 때 오타를 만들었고 두 번째 JOIN에 associations.city_id 대신 associations.business_id를 넣는 것입니다. 나는 그것을 고쳤지만 시간이 지나지 않았기 때문에 오류가 대답에 반영됩니다. 어쩌면 당신은 그것을 바꾸고 싶을 것입니다. :) – kvolden

관련 문제