0

ウェブサイト(旅行代理店)の場合、パフォーマンスの向上に取り組んでいます。現在、検索モジュールを最適化しています。とりわけ、目的地を保持する選択ボックスを最適化したいと思います。システムにはいくつかの目的地がありますが、すべての目的地に予約可能な宿泊施設があるわけではありません。ですから、少なくとも1つの宿泊施設がある目的地のリストが欲しいのです。宛先テーブル(テーブル名:geodata)には、国、地域、地域、都市の4つのタイプがあります。(一種の*)不適切な開発のため、収容テーブルは4つの外部キー(fk_country、fk_area、fk_region、およびfk_city)を保持します。*機能が開発されるたびに、成長と今後の要件のため。

IFステートメントに基づいて左結合を使用して次のことを試しました。しかし、このクエリは半分の作業しか実行しません。特定の国、地域、地域、または都市ごとの宿泊施設の数に最も関心があります。現時点では、宿泊施設の総数しかわかりません。このクエリを微調整して、特定の場所のタイプごとに宿泊施設の数を正しく取得する方法。

私の質問:

SELECT      geodata.id, 
            geodata.type,
            COUNT(accommodation.id) AS count_accommodations
FROM        geodata
LEFT JOIN   accommodation
ON          IF(geodata.type = 'Country', accommodation.fk_country,
                IF(geodata.type = 'Area', accommodation.fk_area,
                    IF(geodata.type = 'Region', accommodation.fk_region, accommodation.fk_city)
                )
            )
GROUP BY    geodata.id
HAVING      count_accommodations > 0

現在の出力:

|id|type   |count_accommodations|
---------------------------------
| 1|Country|                   2|
| 2|Area   |                   2|
| 3|Area   |                   2|

期待される出力

|id|type   |count_accommodations|
---------------------------------
| 1|Country|                   2|
| 2|Area   |                   1|
| 3|Area   |                   1|

どんな助けでも大歓迎です。

4

1 に答える 1

1

結合条件がないため、機能しません。外部キー(fk_country、fk_area、...)を評価しますが、どこでも使用しません。

...
left join accommodation
on (... fk_...) = geodata.???
group by geodata.id
...
于 2012-10-30T22:10:22.510 に答える