2011-10-24 22 views
1

私は2つのテーブル、確立とブランチを持っています。 Establishmentは親テーブルです。ブランチのリストを選択すると、ブランチのタイトルが空白の場合、そのブランチの名前を取得します。また、私は、各事業所に対して1回だけ支店を見せたいと思っています。これは私が思いついたものです: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を選択していますが、それらのうちの1つでグループ化します(これは無効ですが、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の別の潜在的な問題。あいまいでもあります。特にあなたはLEFT JOINを持っているので名前( 'branch.establishment_ID')を修飾するか、または' GROUP BY 2'を置き換えてください。 –

関連する問題