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