0

まず、私のデータ構造について説明させてください。

profile と呼ばれるモデルがあります。witch はサービス プロバイダーのプロファイルです。サービス プロバイダーは、2 つの異なるタイプの「旅行」から選択することができます (両方とも)。1つめの移動モードは「依頼先に行ける」。そのために、サービス プロバイダーは、旅行できるすべての都市を入力する必要があります (多対多)。2 つ目の「旅行」モードは、「クライアントが来てくれる」です。それら、彼はリストから配置された都市を選択します(1対多)。

「私はクライアントに行くことができます」という旅行モードの場合、profile_id と local_id を持つ locals_profile テーブルと、都市名を持つ locals テーブルがあります。

「私のクライアントは私に来ることができます」のために、私は profile_id と city_id を持つ location テーブルと、都市の名前を持つ都市テーブルを持っています。

あなたが尋ねる前に、プロジェクトのモデリングの他の理由により、両方のケースで都市名に同じテーブルを使用できませんでした (使用できれば、パフォーマンスが向上しますか?)。

また、プロファイルは多くの sub_categories に属しているため、sub_category_id フィールドと profile_id フィールドを含む profile_sub_categories という別のテーブルが表示されます。

私が欲しいのは、sub_category を指定して、各都市にあるアイテムの数を表示することです。例えば:

  • 「デザイナー」サブカテゴリの場合:
    • ニューヨーク (100)
    • サンフランシスコ (50)
    • マイアミ (10)
    • ... (最大 10 都市)

次のクエリで、私が望んでいたことを達成しました。

select q1.city_name, if(q1.city_count is null, 0, q1.city_count) + if(q2.city_count is null, 0, q2.city_count) city_count
from
  (select l.name as city_name, count(*) as city_count from locals_profiles lp
  inner join locals l on l.id = lp.local_id
  inner join profiles p on p.id = lp.profile_id
  inner join profiles_sub_categories ps on ps.profile_id = p.id
  where ps.sub_category_id = 97 and l.level = 2
  group by 1) q1
left join
  (select c.name as city_name, count(*) as city_count from cities c
  inner join locations lo on lo.city_id = c.id
  inner join profiles p on lo.profile_id = p.id
  inner join profiles_sub_categories ps on ps.profile_id = p.id
  where ps.sub_category_id = 97
  group by 1) q2
on q1.city_name = q2.city_name
order by 2 DESC
limit 10;

しかし、クエリの実行に時間がかかりすぎています。これは Web アプリケーションなので、ほぼ瞬時に実行する必要があります。私が試みていることを行うためのより良い方法を知っている人はいますか?

4

1 に答える 1

0

私は、mysql がクエリの最適化に優れた仕事をしていないことを発見しました。簡単な解決策は、2 つのクエリを作成し、それらをアプリケーション層でマージすることです。意外に早いかも…。

または、ビュー (q1、q2) を削除して、代わりに同じテーブルを複数回エイリアスすることもできます。直るの大変かも…。

于 2012-09-04T23:55:39.917 に答える