0

私は3つのテーブルを持っています:

  • 店舗(住所・カテゴリー表と連動)
  • ブランド(カテゴリー表にリンク)
  • ショッピングモール(住所にリンク)

ここに画像の説明を入力

を検索するときは、ac各テーブルを検索し、 で始まるすべての行をフェッチする必要がありますac

私もフェッチする必要があります

  • 各店舗の住所とカテゴリー
  • 各ショッピングモールの住所
  • 各ブランドのカテゴリー

私の検索ではオートコンプリートを使用していますが、結果を 1 つの大きなチャンクに表示するのではなく、結果をストア、ブランド、ショッピング モールに分割します。

私の現在の解決策は、3 つの個別の SQL クエリを実行し、結果を ann 配列に入れて返すことです。

しかし、この方法でクエリを実行することが最も効率的な方法だとは思いません。検索速度を上げる良い方法はありますか? 複雑な検索のベスト プラクティスはありますか?

名前や住所などを索引にしています。

現在、MySQL DB しか使用できません。

4

1 に答える 1

1

正確なテーブル構造を知らなくても、次のようなものを提案します。

SELECT
 stores.name AS name,
 addresses.street AS street,
 addresses.city AS city,
 'store' AS type,
 GROUP_CONCAT(categories.categoryname) AS category
FROM
 stores
INNER JOIN
 addresses ON addresses.addressid = stores.storeid
INNER JOIN
 categories AS categories.storeid = stores.storeid
WHERE
 stores.name LIKE "ac%"
GROUP BY
 stores.storeid
UNION
SELECT
 brands.name AS name,
 '-' AS street,
 '-' AS city,
 'brand' AS type,
 GROUP_CONCAT(brandcategories.categoryname) AS category
FROM
 brands
INNER JOIN
 brandcategories AS brandcategories.brandid = brands.brandid
WHERE
 brands.name LIKE "ac%"
GROUP BY
 brands.brandsid
UNION
SELECT
 malls.name AS name,
 addresses.street AS street,
 addresses.city AS city,
 'mall' AS type,
 '-' AS category
FROM
 malls
INNER JOIN
 addresses ON addresses.addressid = malls.mallid
WHERE
 malls.name LIKE "ac%"
GROUP BY
 malls.mallid

SELECT...テーブルごとにaを実行し、それらを UNION します。各 SELECT は columntypeを取得します。type は store、brand、または mall です。したがって、後で PHP コードで区別できます。

UNION 内のすべての SELECT は同じ列を必要とするため、ブランドなどの SELECT もアドレスを返しますが、それは空です。

この例では、すべてのストア/ブランドが複数のカテゴリを持つことができ、カンマ区切りのフィールド ( GROUP_CONCAT(categories.categoryname)) で一度に返されます。

于 2013-11-03T10:07:15.373 に答える