Php 搜索3个表及其相关表的最有效方法是什么?

Php 搜索3个表及其相关表的最有效方法是什么?,php,mysql,search,Php,Mysql,Search,我有三张桌子: 存储(链接到地址和类别表) 品牌(链接到类别表) 购物中心(链接至地址) 当我搜索ac时,我需要搜索每个表并获取以ac开头的所有行 我还要去拿 每个商店的地址和类别 每个购物中心的地址 每个品牌的类别 我的搜索是使用自动完成,但我不想在一个大屏幕上显示结果,而是将结果分为商店、品牌和购物区 我目前的解决方案是执行3个单独的SQL查询,并将结果放入ann数组中并返回 但我不认为用这种方式进行查询是最有效的方式。有没有更好的方法来提高我的搜索速度?对于复杂的搜索是否有最佳实

我有三张桌子:

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

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

我还要去拿

  • 每个商店的地址和类别
  • 每个购物中心的地址
  • 每个品牌的类别
我的搜索是使用自动完成,但我不想在一个大屏幕上显示结果,而是将结果分为商店、品牌和购物区

我目前的解决方案是执行3个单独的SQL查询,并将结果放入ann数组中并返回

但我不认为用这种方式进行查询是最有效的方式。有没有更好的方法来提高我的搜索速度?对于复杂的搜索是否有最佳实践

我正在为诸如姓名和地址之类的东西编制索引


目前,我只能使用MySQL DB。

在不知道确切的表结构的情况下,我会提出类似的建议:

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
对每个表执行
选择…
,并合并它们。每项选择都会获得一列
类型
,其中类型可以是商店、品牌或商场。因此,您可以在以后的PHP代码中区分它

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


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

将查询合并到一个联合搜索中,在解释之后,在需要的地方添加索引。你不需要全文搜索。只是想澄清一下:如果你搜索
ac
,你会搜索以
ac
开头的品牌、商店和购物中心?@Reeno是的,我不会做全文搜索。我的服务基于快速搜索,所以它需要,嗯,快速:)我的数据库现在很小,但它会增长。随着时间的推移,我可能会使用ElasticSearch之类的工具。一个品牌没有地址,一个购物中心也没有类别,所以我认为最好做三个查询并将它们合并。在品牌查询中,添加一个空列作为地址(`-'作为地址),与购物中心和类别相同。嗯。。。好吧。但如果我做一个联合,我怎么能在PHP中知道一行是商店,另一行是品牌?