5

我需要帮助解决这个问题。

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

Field  : artist_list  
Values : 1,5,3,401

我需要找到艺术家 uid 401 的所有记录

我这样做

SELECT uid FROM tbl WHERE artist_list IN ('401');

我有所有记录,其中艺术家列表字段值仅为“401”,但如果我有 11,401,则此查询不匹配。

任何的想法 ?

(我不能使用 LIKE 方法,因为如果艺术家 uid 为 3(匹配 30、33、3333)...

4

3 回答 3

11

短期解决方案

使用FIND_IN_SET 函数

SELECT uid 
  FROM tbl 
 WHERE FIND_IN_SET('401', artist_list) > 0

长期解决方案

规范化您的数据 - 这似乎是一个已经涉及两个表的多对多关系。逗号分隔的列表需要变成它自己的表:

ARTIST_LIST

  • 艺术家 ID(主键,艺术家的外键)
  • uid(TBL 的主键、外键)
于 2010-10-15T23:24:53.273 回答
2
SELECT uid
FROM tbl
WHERE CONCAT(',', artist_list, ',') LIKE '%,401,%'

尽管首先正确地规范化您的数据会更有意义。然后您的查询将变得微不足道并具有更好的性能。

于 2010-10-15T23:24:46.787 回答
2

你的数据库组织有问题;你需要标准化它。与其让一行包含以逗号分隔的值列表,不如每行执行一个值:

uid    artist
1      401
1       11
1        5
2        5
2        4
2        2

然后可以查询:

SELECT uid
  FROM table
 WHERE artist = 401

您还应该研究数据库规范化,因为您所拥有的只会在未来引起越来越多的问题。

于 2010-10-15T23:29:10.240 回答