【问题标题】:Find value in comma delimited string mysql在逗号分隔的字符串mysql中查找值
【发布时间】:2014-08-04 13:56:11
【问题描述】:

我的数据库中有一个如下所示的表:

member_id    name    mgroup_others    member_group_id
    1        Name1      2,3,10              1
    2        Name2      4,5,10              1
    3        Name3      6,7,10              1
    4        Name4       8,9                1

我需要创建一个选择所有成员的 SELECT 语句,其中指定的整数位于“mgroup_others”逗号分隔列表中。例如,我将编写一条 SQL 语句,选择“mgroup_others”包含“10”的所有成员,并返回成员 1、2 和 3,但不返回 4,因为 10 不在该字段中。任何帮助将不胜感激!谢谢。我也在用 PHP 写这个。

【问题讨论】:

  • FIND_IN_SET() 可能会很有用。
  • 蹩脚方式:使用FIND_IN_SET(这种方式will not use indices),酷方式:规范化数据库。
  • 我无法标准化数据库,因为它是以这种方式构建的大型 CMS 的一部分。
  • @Fred-ii- FIND_IN_SET 基本上是一个字符串操作。您可以将其视为LIKE 的特殊版本。因此使用FIND_IN_SET 绕过了对该字段的索引的使用。标准化版本可能会更快,更便携。缺点是您需要一个额外的表,但如果您正在构建一个严肃的应用程序,那么您可能无论如何都会有多个表,并且规范化这应该不是障碍。所以FIND_IN_SET 是蹩脚的,因为它让人很想不能正确地规范你的数据库。 ;)
  • @Fred-ii- 不客气。 :) 也许你可以阅读this pretty short Wikipedia chapter。它列出了各种范式。现在也许您还不想学习和使用所有这些,但是使字段“原子”(在单个字段中不包含多个值)实际上是第一个范式,因此是规范化的第一步。并且需要制定适当的外键约束和索引。这是在数据量增长时保持数据库性能的第一步,也可能是最重要的一步。

标签: php mysql sql select where


【解决方案1】:

由于mgroup_othersvarchar 列,如果您只使用LIKE 运算符而不是FIND_IN_SET() 之类的会怎样

select * from table1
where mgroup_others like '%10'

你也可以像下面这样使用FIND_IN_SET()

select * from table1
where find_in_set(10,mgroup_others)

在此处查看演示小提琴http://sqlfiddle.com/#!2/034711/2

【讨论】:

  • 这仅在没有其他组以10 结尾时才有效,即110
  • 这也将匹配1,2,1000。如果你要使用like,你应该有类似WHERE CONCAT(',', mgroup_others, ',') LIKE '%,10,%' 或类似的东西。与 FIND_IN_SET 函数相比,它不是很方便,因为它本身已经很灵活了。
  • @FuzzyTree,没错。 find_in_set() 会很合适,但没有将其包含在答案中,因为 Mihai 已经回答了它,但请参阅包含的小提琴,这是双向的。
  • @GolezTrol,请参阅随附的小提琴。我也提到了find_in_set() 的查询。没有包括它,因为它已经在 Mihai 的回答中提到。无论如何,编辑了我的答案。
  • 我明白了,但您的回答说您可以避免使用find_in_set,而使用like。这不仅会给出不正确的结果(特别是如果您想在没有第二个% 的情况下找到匹配“3”的项目)。所以现在你有一个错误的答案和一个不能证明你的答案而是 Mihai 的小提琴。
【解决方案2】:
SELECT * FROM table WHERE FIND_IN_SET(10,mgoup_others)>0

这是一个临时解决方案,在生产数据库中这将比涡轮蜗牛慢。

【讨论】:

  • 我认为> 0 并不是真正需要的。在此处查看小提琴以了解其工作原理sqlfiddle.com/#!2/034711/2
  • @Rahul 可能是,我一直使用 > 0。
【解决方案3】:

使用喜欢

SELECT * 
FROM yourtable 
WHERE mgroup_others LIKE '%10%'

【讨论】:

  • 这也将匹配1,2,1000。如果你使用like,你应该有WHERE CONCAT(',', mgroup_others, ',') LIKE '%,10,%' 之类的东西。与 FIND_IN_SET 函数相比,它不是很方便,因为它本身已经很灵活了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 2013-11-02
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
  • 2020-01-04
相关资源
最近更新 更多