通过SQL搜索数组中的字符串

时间:2016-11-08 09:50:08

标签: php mysql

我有一个名为'商品'的表格,其中包含in_stores列。它包含此商品可用的商店的ID。图形显示如下:

id | title    | in_stores
1  | Shoes    | 1002,1003
2  | Gloves   | 1020,1011
3  | Shades   | 1002,1009
4  | Hats     | 1010,1002
5  | Shoes    | 1220
6  | Shirts   | 1010
7  | Hats     | 1002

in_stores中的每个值都通过PHP与implode()函数一起保存。

我的问题: 如何在单个mysqli查询中选择ID为1002的商店中可用的所有商品。在此示例中,查询应返回ID为1,3,4,7的商品。我想我应该首先使用explode()来获取数组中的结果,而不是使用in_array()来搜索其中的特定id,但所有这些函数在SQL中都不可用。

3 个答案:

答案 0 :(得分:1)

这是存储逗号分隔字段的主要问题。

MySQL确实有一个允许搜索这些功能的功能,这比尝试依赖使用LIKE要可靠得多。但由于它仍然不能有效地使用任何索引,因此它不会很快。

SELECT *
FROM offers
WHERE FIND_IN_SET('1002', in_stores)

最好重新设计数据库,以便为每个id使用一个额外的表,每个值都有一行。

答案 1 :(得分:0)

你“可以”使用LIKE查询来执行此操作,但不建议这样做。

SELECT * FROM offers WHERE in_stores LIKE "%1002%"

只要您没有大于9999的值,这将起作用。 但是当您的某个商店的11002标识为99991002时,它也会返回这些不需要的值。

你应该做的是将你的mysql表转换为第二个表storeLocations或者......其他。这应该只包含属性offer_idstore_id。 它会将您的数据转换为:

`offers`
id | title   
1  | Shoes    
2  | Gloves  
3  | Shades   
4  | Hats    
5  | Shoes   
6  | Shirts  
7  | Hats    

`storeLocations`
offer_id, store_id
1        | 1002
1        | 1003
2        | 1020
2        | 1011
3        | 1002
3        | 1009
4        | 1010
4        | 1002
5        | 1220
6        | 1010
7        | 1002

然后你可以选择

SELECT * FROM offers AS o 
   LEFT JOIN storeLocations as l ON (o.id=l.offer_id) 
   WHERE l.store_id = 1002;  

现在,当您插入数据时,您不必使用implode,而是在storeLocations中插入尽可能多的行,因为该特定项目有store_id。

有关该主题的更多信息,请查看here

答案 2 :(得分:-1)

我认为您应该使用MySQL LIKE运算符。它在数据库列中搜索查询中指定的字符串。

尝试此查询:

$sql = "SELECT * FROM offers WHERE in_store LIKE  '%1002%'";

点击此链接获取更多说明:W3Schools - SQL LIKE Operator

我认为应该这样做。