2011-10-24 2 views
1

두 개의 테이블, 설정 및 분기가 있습니다. Establishment가 상위 테이블입니다. 지점 목록을 선택하면 지점 제목이 비어 있으면 식당 이름을 검색해야합니다. 또한, 나는 단지 한 식당에 한 번씩 지점을 보여주고 싶다. 이것은 내가 생각해 낸 것입니다 :ORDER BY가 GROUP BY와 함께 작동하지 않음

SELECT 
    branch.id 
    , branch.establishment_ID 
    , IFNULL(branch.branch_title, establishment.name) AS branch_title 
FROM branch 
LEFT JOIN establishment ON branch.establishment_ID = establishment.id 
WHERE cityID = 2 
GROUP BY establishment_ID 
ORDER BY branch_title 

그러나 결과는 특정 순서로 나타나지 않습니다. 나는 그들이 알파벳 순서대로되기를 바란다. 나는 MySQL 5.0.5가 GROUP BY와 ORDER BY에 동일한 쿼리에서 문제가 있다는 것을 읽었지만 5.5.9로 작업하고있다. 이 쿼리를 수정하려면 어떻게해야합니까?

+1

그룹은 불확정합니다. 그게 네 문제 다. 전체 쿼리가 의미가 없으므로 관련없는 행의 데이터가 혼합된다. – Johan

+0

branch.id 및 establishment_id에 집계 함수를 사용하고 있지 않습니다. 여러 개의 establishid 또는 분기 ID가있는 경우 그룹화 할 때 선택되는 집계 함수 (예 : max)를 제공해야합니다. – macleojw

+0

3, 비 집계, branch.id, branch.establishment_ID, branch_title 중 하나만 선택합니다 (mysql이 불평하지 않지만 유효하지 않습니다). 3 명 모두를 그룹화해야합니다. – nos

답변

1

ORDER BY이 새 별칭이 아닌 branch.branch_title에 적용된다고 추측합니다 (다른 SQL 시스템을 알고있는 것 같습니다). 표현식을 ORDER BY에 복사 할 수 있습니까?

SELECT 
    branch.id 
    , branch.establishment_ID 
    , IFNULL(branch.branch_title, establishment.name) AS branch_title 
FROM branch 
LEFT JOIN establishment ON branch.establishment_ID = establishment.id 
WHERE cityID = 2 
GROUP BY establishment_ID 
ORDER BY IFNULL(branch.branch_title, establishment.name) 

그렇지 않으면, NULL branch_title 행은 항상 (/ 후 전) 비 NULL 것들을 표시되며, 어떤 방식으로 정렬되지 않습니다.

+0

예, 모호하기 때문에 별명이 아닌 표현식을 사용하십시오. – gbn

+0

출력 열 3의 값을 사용하려면'ORDER BY 3 '이라고 쓰면됩니다. 계산 된'branch_title'에 ** 다른 이름 **을 사용하는 것을 피하십시오 실수. BTW, GROUP BY establishment_ID로 또 다른 잠재적 인 문제. ambiguos 일 수 있습니다. 특히 당신은 'LEFT JOIN'을 가지고 있습니다. 이름 ('branch.establishment_ID')을 한정하거나'GROUP BY 2 '로 대체하십시오. –

관련 문제