【问题标题】:Get all row had value in column获取所有行在列中有值
【发布时间】:2018-06-26 15:32:47
【问题描述】:

如何在column news_short 中获取值为 1 而不是 11 的所有行?

这是我的桌子:

id |   news_short  |
 1 | 1,2,3,4,5,6,7 |
 2 | 2,4,5,6,1,5,6 |
 3 | 11,2,5,6,9,4  |

【问题讨论】:

  • 更好地规范你的数据结构,那么它真的很简单
  • 现在您可能会明白为什么在单列中以逗号分隔的列表存储键是个坏主意

标签: php mysql codeigniter


【解决方案1】:

我同意你应该正常化。但这里是它的解决方案。

Select * from table where news_short like '%1,%' and 
news_short not like '%11,%';

【讨论】:

  • 还会找到 918171 或其他以 1 结尾的数字。
  • 没错,也不会消除 111 或 1111,但他就是这样问的。
  • 1 是示例,我有很多很多数字,所以我尝试 find_in_set,它对我的​​问题有效谢谢大家!
【解决方案2】:

FIND_IN_SET() 如果字符串存在于字符串列表中(作为子字符串),则返回该字符串的位置

所以你应该搜索一个值是否为 != 11

例如:

->where("FIND_IN_SET(news_short) !=", 11)

【讨论】:

    【解决方案3】:

    您最好的选择是规范化您的架构不要以逗号分隔列表的形式存储关系,而是创建一个联结表来维护m:m many to many,或者如果它是主表和主表之间的一对多关系这些news_short(可能来自其他表)值,创建一个新表作为news_short,列main table id和news(table) id,并在每一行中为每个your_table和news保存一个关联。

    如果您无法更新/更改架构,您可以使用 find_in_set(),但这不是一个好的选择

    select * 
    from your_table 
    where find_in_set(1, news_short) > 0
    

    demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      • 2021-12-18
      • 1970-01-01
      • 2018-09-27
      • 2021-10-29
      • 1970-01-01
      相关资源
      最近更新 更多