【问题标题】:How to compare the a single value among the comma seperated values in a column of a database using Select Query?如何使用 Select Query 比较数据库列中逗号分隔值中的单个值?
【发布时间】:2011-06-15 18:06:57
【问题描述】:

我有一个值,例如“1”,我的数据库表“tbl_grp”中有“grp_id”列。此列“grp_id”包含逗号分隔值,例如“1,2,3”我正在寻找一种方法来将我的单个值与列“grp_id”进行比较。

现在我正在使用以下查询:

"SELECT user_id, user_fname, user_lname FROM tbl_grp WHERE grp_id='1'";

【问题讨论】:

  • 使用联结表(包含user_id,grp_id)而不是逗号分隔值。
  • @Martin 我在列中有一个逗号分隔的值,我无法按照你建议我朋友的方式更改它,我必须使用同一张表

标签: sql mysql normalization


【解决方案1】:

您的数据不是第一范式。如果您遵循第一范式的规则,您将拥有对所有数据的键控访问权限。某些查询可能仍会导致表扫描,但不是这种。

不要将 CSV 用于可搜索的项目。将此字段分解为 1NF 等效项。

这不是另一个答案所说的多对多关系。这是一对多。

【讨论】:

  • 大概1个用户可以属于多个组,每个组有多个用户?
【解决方案2】:

你可以FIND_IN_SET:

SELECT user_id, user_fname, user_lname FROM tbl_grp WHERE FIND_IN_SET(1, grp_id);

但正确的做法是在用户和组之间建立多对多关联,而不是在列中存储以逗号分隔的 id 列表:

user(user_id, user_fname, ...)
group(group_id, group_name, ...)
user_group(#user_id, #group_id) // you can have any number of (user_id, group_id) couples

【讨论】:

  • @user576875 这个解决方案有什么缺点吗?
  • FIND_IN_SET() 或任何其他类似的解决方案将比正确的数据库设计慢(如我回答的第二部分所述)
  • @user576875 我无法理解你回答的第二部分
  • @SomeoneWhoHasDownVoted 请提供拒绝投票答案的原因。为什么它被拒绝投票
  • @user* 这叫做规范化
【解决方案3】:

您正在寻找FIND_IN_SET:

SELECT user_id, user_fname, user_lname 
FROM tbl_grp 
WHERE FIND_IN_SET('1', grp_id);

【讨论】:

  • @SomeoneWhoHasDownVoted 请提供拒绝投票答案的原因。为什么它被拒绝投票
【解决方案4】:

试试这个,

SELECT user_id, user_fname, user_lname FROM tbl_grp WHERE grp_id LIKE '1';

试试我不是 db 的主人,但我最好建议这个。

【讨论】:

    猜你喜欢
    • 2010-12-09
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多