我有一个名为'商品'的表格,其中包含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中都不可用。
答案 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_id
和store_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
我认为应该这样做。