0

我有三张桌子:

  • 存储(链接到地址和类别表)
  • 品牌(链接到类别表)
  • 购物中心(链接到地址)

在此处输入图像描述

当我搜索 时ac,我需要搜索每个表并获取所有以 开头的行ac

我也需要取

  • 每个商店的地址和类别
  • 每个购物中心的地址
  • 每个品牌的类别

我的搜索使用自动完成,但我不想将结果显示在一大块中,而是将结果划分为商店、品牌和购物中心。

我目前的解决方案是执行 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...为每个表做一个并联合它们。每个 SELECT 都有一个 column type,其中 type 可以是 store、brand 或 mall。所以你可以稍后在你的 PHP 代码中区分它。

由于 UNION 中的每个 SELECT 都需要相同的列,因此例如品牌的 SELECT 也会返回一个地址,但它是空的。

GROUP_CONCAT(categories.categoryname)在此示例中,每个商店/品牌都可以有多个类别,这些类别会在逗号分隔的字段 ( )中一次返回。

于 2013-11-03T10:07:15.373 回答