Mysql中逗号分隔列表的问题

Mysql中逗号分隔列表的问题,mysql,sql,denormalized,Mysql,Sql,Denormalized,我需要帮助解决这个问题 在MYSQL表中,我有一个字段: Field : artist_list Values : 1,5,3,401 我需要找到艺术家的所有唱片 我这样做 SELECT uid FROM tbl WHERE artist_list IN ('401'); 我有艺术家列表字段值仅为“401”的所有记录,但如果我有11401,则此查询不匹配 有什么想法吗 (我不能使用用户喜欢的方法,因为如果艺术家uid是3(匹配30、33、3333) 虽然首先正确地规范化数据会更有意义,

我需要帮助解决这个问题

在MYSQL表中,我有一个字段:

Field  : artist_list  
Values : 1,5,3,401
我需要找到艺术家的所有唱片

我这样做

SELECT uid FROM tbl WHERE artist_list IN ('401');
我有艺术家列表字段值仅为“401”的所有记录,但如果我有11401,则此查询不匹配

有什么想法吗

(我不能使用用户喜欢的方法,因为如果艺术家uid是3(匹配30、33、3333)

虽然首先正确地规范化数据会更有意义,但这样您的查询就会变得微不足道,性能也会更好。

短期解决方案 使用:

长期解决方案 规范化数据-这似乎是一个多对多关系,已经涉及两个表。需要将逗号分隔的列表转换为自己的表:

艺术家名单
  • 艺术家id(主键,艺术家外键)
  • uid(主键,TBL的外键)

您的数据库组织是一个问题;您需要对其进行规范化。与其让一行包含逗号分隔的值列表,不如每行执行一个值:

uid    artist
1      401
1       11
1        5
2        5
2        4
2        2
然后您可以查询:

SELECT uid
  FROM table
 WHERE artist = 401

您还应该研究数据库规范化,因为您所拥有的将在将来导致越来越多的问题。

您正在以一种非常糟糕的方式存储数据,因此会遇到问题。最好的做法是这样做。我可以想象,在这里会出现非常昂贵的
REGEXP
答案,这将是灾难性的我们关注性能。
FIND_IN_SET
稍微好一点,但不能替代适当的规范化。阅读我的答案。绝对是最佳选择。+1是的,当然……但这不是我的问题:)@soulfaya:我在查询本身的
artist_list
两端添加逗号来处理这种情况。回答很好,但是
+
是Microsoft SQL Server中的字符串连接运算符,而不是MySQL。在MySQL中,使用
CONCAT()
函数,或者
将SQL_MODE='PIPES_设置为_CONCAT'
并使用
|
uid    artist
1      401
1       11
1        5
2        5
2        4
2        2
SELECT uid
  FROM table
 WHERE artist = 401