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

时间:2013-09-06 09:38:13

标签: 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的行 结果应该显示row1和row2
感谢

enter image description here

4 个答案:

答案 0 :(得分:0)

如果您打算通过SQL搜索字段,请将其存储为多行,不要将其序列化。

如果有某些原因,你可能需要提取每一行,反序列化它(对于你的情况,使用explode(),然后单独匹配,这会占用大量的处理能力。

答案 1 :(得分:0)

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

但是:良好的数据库结构可以避免所有这些,并且每行只有一个条目而不是列表

答案 2 :(得分:-1)

为了完整起见,我也将此作为答案发布,因此在评论的大讨论中不会丢失;)

首先,如果你想在SQL的一列中有多个值,那么set-column就是你要走的路。例如,请参阅herehere。但是如果你绝对无法在一列中找到多个值并且可以保证它们将始终以相同的模式出现(以逗号分隔,没有空格),那么你可以搜索包含2个特定值的行,你可以这样做(根据你的例子)

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*/
  )

您也可以在此fiddle中试试。

答案 3 :(得分:-2)


  

for exp:我想搜索其中有15,69的行


如果您可以在值之前和之后添加空格,那么可以轻松检查fiddle

喜欢

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 %';