【发布时间】: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