【问题标题】:Search in column that has array(value1,value2,...) in sql table在 sql 表中具有 array(value1,value2,...) 的列中搜索
【发布时间】:2013-09-10 08:49:40
【问题描述】:

我有一个名为“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
谢谢

【问题讨论】:

  • 你可以在你的sql查询中使用like
  • 这是一个集合列还是一个带有逗号分隔值的实际 varchar?对于后者,您可以在 select 语句中使用类似比较,否则请在此处查找对 set-columns 的操作dev.mysql.com/doc/refman/5.1/en/set.html
  • 您可以尝试使用正则表达式(这也可以解决下面用 LIKE 描述的所有问题),但这会减慢您的查询速度。像juergen d 描述的那样转换您的表结构,并了解有关database normalization 的一些信息。这将解决您的问题。

标签: php sql


【解决方案1】:

永远,永远,永远不要在一列中存储多个值!

正如您现在看到的,这只会导致问题。请先像这样规范化您的数据库结构

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

【讨论】:

  • @moumouh206:由于您可能使用 MySQL,您可以使用 find_in_set()
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 在类似查询中某些值是错误的,例如如果我想显示值为“1”的行,所有值为 1 的行都显示为“10,11,12,13,.. 。”
      • 只需要更明确地说明您需要查找value LIKE '69,%' OR value LIKE '%,69' OR value = '69' 并将其与AND 以及您还需要对该行的所有其他限制相结合
      • @DrCopyPaste 但我现在很困惑,如果行中的值是 ,6969,
      • value LIKE '69,%' OR value LIKE '%,69' OR value = '69' 也匹配 690、691 或 169、269 之类的数字... --> 也不起作用
      • 我找到了像 :p 这样的解决方案,我在每个值的开头添加了所有行 '0',最后添加了 ',0',这样我就可以使用 '%,value,%' any我想要的值,它总是返回一个正确的值:)
      【解决方案5】:

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

      首先,如果您想在 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 中尝试一下。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-04
        • 1970-01-01
        • 2020-01-17
        • 1970-01-01
        相关资源
        最近更新 更多