以前:Select2问题
更改为:与SQL密切相关的问题。 (不想浪费赏金,因为我没有得到答案,我的赏金仍然是开放的!)
基本上,我有2个查询。一个是通用的,一个是基于搜索。
一:得到一切(这里没有问题)
SELECT store_info.storeID, store_info.name, store_info.address, store_info.phone, GROUP_CONCAT(brands.name) AS brands
FROM store_info, brands, stores, store_brands
WHERE stores.city = $cityID
AND store_brands.store = stores.ID
AND brands.id = store_brands.brand
AND stores.ID = store_info.storeID
GROUP BY store_info.storeID
ORDER BY store_info.name
此查询完全符合我的要求。它为我的商店提供了格式为brand1,brand2,brand3,brand4,brand5
等的品牌。
现在,我还有一个搜索功能,您可以在其中搜索基于品牌的商店。它基本上是相同的查询,带有一个小调整(此处发布):
SELECT store_info.storeID, store_info.name, store_info.address, store_info.phone, GROUP_CONCAT(brands.name) AS brands
FROM store_info, brands, stores, store_brands
WHERE stores.city = $cityID
AND store_brands.store = stores.ID
AND brands.ID = store_brands.brand
AND stores.ID = store_info.storeID
AND brands.ID IN (" . implode(",", $brandIDs) . ")
GROUP BY store_info.storeID
ORDER BY store_info.name
最后一个问题的问题是我仍然希望它能够返回所有品牌。我只是想操纵以后搜索过的品牌。我看待它的方式,我应能够以多种方式完成它:
1)返回查询中的所有品牌并在浏览php时操纵品牌(我已经存储了搜索条件,但我不知道如何在没有获得所有商店的情况下执行此操作,这不是什么我想这样做)
2)返回1个搜索匹配品牌的字段,以及剩余品牌的其他字段。 (理想选择,但我不知道如何。将整个查询放入带调整的连接中似乎效率低下)
3)(似乎效率低下,我不喜欢它)从查询中获取找到的商店,运行新查询以查找与找到的商店相关的品牌,然后将结果与php结合。但是,这会增加额外的查询,效率是优先事项。
我遇到的问题是,如果有人搜索说,2个品牌,并且有两个商店都匹配,那么它只显示2个品牌中的1个。 (第一次打击,我猜)。
对此最后一次查询的任何帮助都非常感谢!
提前致谢!
编辑:更深入了解搜索功能 搜索功能搜索与搜索的品牌相关的商店。它应该显示与所述品牌相关的商店,但不限于仅返回被搜索的品牌。
答案 0 :(得分:1)
你可以第二次加入store_brands
表格(AS restraint
在下面的代码中)并对其进行限制:
SELECT store_info.storeID, store_info.name, store_info.address, store_info.phone, GROUP_CONCAT(DISTINCT(brands.name)) AS brands
FROM store_info, brands, stores, store_brands, store_brands AS restraint
WHERE stores.city = $cityID
AND store_brands.store = stores.ID
AND brands.ID = store_brands.brand
AND stores.ID = store_info.storeID
AND restraint.ID IN (" . implode(",", $brandIDs) . ")
GROUP BY store_info.storeID
ORDER BY store_info.name
通过两次加入表格,它将被用于(1)该商店中可用的所有品牌,以及(2)将所选商店限制为具有一个或多个指定品牌的商店。
答案 1 :(得分:1)
GROUP_CONCAT
会忽略NULL
,因此您可以像这样创建GROUP_CONCAT
匹配项:
SELECT
store_info.storeID,
store_info.name,
store_info.address,
store_info.phone,
GROUP_CONCAT(brands.name) AS brands,
GROUP_CONCAT(
CASE WHEN brands.ID IN (" . implode(",", $brandIDs) . ")
THEN brands.name
ELSE NULL
END
) AS available_brands
FROM
stores
INNER JOIN store_info ON (stores.ID = store_info.storeID)
INNER JOIN store_brands ON (stores.ID = store_brands.store)
INNER JOIN brands ON (store_brands.brand = brands.id)
WHERE stores.city = $cityID
GROUP BY store_info.storeID
ORDER BY store_info.name
答案 2 :(得分:0)
SELECT
子句中的CASE
语句如何根据匹配条件返回true或false,即brands.ID
是否在$brandIDs
列表中}。
SELECT
store_info.storeID,
store_info.name,
store_info.address,
store_info.phone,
GROUP_CONCAT(brands.name) AS brands,
(
CASE
WHEN brands.ID IN (" . implode(",", $brandIDs) . ") THEN 1
ELSE 0 --no match
END
) AS matches
FROM store_info, brands, stores, store_brands
WHERE stores.city = $cityID
AND store_brands.store = stores.ID
AND brands.ID = store_brands.brand
AND stores.ID = store_info.storeID
GROUP BY store_info.storeID
ORDER BY store_info.name
我们的想法是,如果brands.ID
是$brandIDs
中的ID之一,那么1
列中将返回matches
。除此之外,还会返回0
。