Php 在sql表中具有数组(value1、value2,…)的列中搜索

Php 在sql表中具有数组(value1、value2,…)的列中搜索,php,sql,Php,Sql,我有一个名为“Offres”的sql表 在该表中,名为“regions”的列包含数组(value1、value2、value3等) 第1行:“35,2,15,69,98” 第2行:“7,9,15,5,69” 第3行:“7,3,45,5,6” 如何搜索同时具有多个值的行 对于exp:我想搜索其中包含15,69的行 结果应显示第1行和第2行 谢谢 Never,Never,Never在一列中存储多个值! 正如你现在看到的,这只会导致问题。请先像这样规范化您的数据库结构 Offers id regi

我有一个名为“Offres”的sql表
在该表中,名为“regions”的列包含数组(value1、value2、value3等)
第1行:“35,2,15,69,98”
第2行:“7,9,15,5,69”
第3行:“7,3,45,5,6”
如何搜索同时具有多个值的行
对于exp:我想搜索其中包含15,69的行
结果应显示第1行和第2行
谢谢

Never,Never,Never在一列中存储多个值! 正如你现在看到的,这只会导致问题。请先像这样规范化您的数据库结构

Offers
id   region
1    35
1    2
1    15
...
2    7
2    9
2    15
...

如果希望通过SQL搜索字段,请将其存储为多行,不要序列化


如果出于某些原因,您必须这样做,您可能必须提取出每一行,对其进行反序列化(对于您的情况,使用
explode()
,并对其进行奇异匹配,这会占用大量处理能力。

您可以使用FIND_IN_SET()在此类列表中搜索元素。 如果需要在行中查找多个条目,则需要进行多次选择

但是:好的数据库结构可以避免所有这些,并且每行只有一个条目,而不是列表 对于exp:我想搜索其中包含15,69的行


如果可以在值之前和之后添加空格,那么可能很容易检查


为了完整起见,我也将此作为一个答案发布,这样它就不会在评论中的大量讨论中丢失;)

首先,如果您想在SQL中的一列中包含多个值,那么set列就是最好的选择。参见示例和。但是,如果您绝对无法在一列中包含多个值,并且您可以保证它们总是以相同的模式出现(逗号分隔,没有空格),那么您可以搜索包含两个特定值的行,您可以这样做(根据您的示例)


您也可以在这里尝试。

您可以在sql查询中使用like。这是一个集合列还是一个实际的带有逗号分隔值的varchar?对于后者,您可以在select语句中使用like比较,否则请在此处查找集合列上的操作,您可以使用正则表达式进行尝试(这也可以解决下面like描述的所有问题),但这会降低查询速度。按照描述的方式转换表结构,并了解有关的内容。这将解决您的问题。在like查询中,某些值是错误的,例如如果我要显示值为“1”的行,则显示值为1的所有行。。。显示为“10,11,12,13,…”只需使类似项更加明确,您需要查找
值,如“69、%”或值“%”、69”或值=“69”
,并将其与
以及所有其他限制结合起来,您也需要为该项设置设置正确的条件row@DrCopyPaste但我现在很困惑,如果第行的值是,6969,
类似于“69、%”的值或类似于“%”、69”的值或类似于“69”的值
也与类似于690、691或169、269的数字匹配…-->不起作用,tooI找到了这样的解决方案:p我在所有行中添加了“0”,在每个值的开头,在最后添加了“0”,这样我就可以用“%”,value,%%搜索我想要的任何值,并且它总是返回一个正确的值:)@moumouh206:因为您可能正在使用MySQL,所以您可以使用
row1 :' 690 , 6969 , 069 , 69069 '
row2 :' 69 , 69 , 69 , 69 , 69 '
row3 :' 6969 , 69 , 69069 '
row4 :' 069 , 69069 '
row5 :' 69 '

    SELECT * FROM Offres WHERE regions LIKE regions LIKE '% 69 %';
SELECT * FROM Offres WHERE
  (
      regions = '15' /*value is the only one in that row, obviously this is not necessary if you look for 2 values at once, but if you would only look for one value at once you MUST include it ;)*/
    OR regions LIKE '%,15' /*value is the last value in that row*/
    OR regions LIKE '15,%' /*value is the first value in that row*/
    OR regions LIKE '%,15,%' /*value is a value somewhere in between other values in that row*/
  )
  AND
  (
      regions = '69' /*value is the only one in that row, obviously this is not necessary if you look for 2 values at once, but if you would only look for one value at once you MUST include it ;)*/
    OR regions LIKE '%,69' /*value is the last value in that row*/
    OR regions LIKE '69,%' /*value is the first value in that row*/
    OR regions LIKE '%,69,%' /*value is a value somewhere in between other values in that row*/
  )