使用单个查询获取其余结果

时间:2016-04-10 00:22:10

标签: php mysql

以前: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个。 (第一次打击,我猜)。

对此最后一次查询的任何帮助都非常感谢!

提前致谢!

编辑:更深入了解搜索功能 搜索功能搜索与搜索的品牌相关的商店。它应该显示与所述品牌相关的商店,但不限于仅返回被搜索的品牌。

3 个答案:

答案 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

小提琴http://sqlfiddle.com/#!9/83e576/1

答案 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