在同一表格中搜索以逗号分隔的字符串

时间:2019-07-15 16:59:50

标签: mysql

如何获取用户收藏夹的ID和名称。

表“用户”

id | name | favourites
----------------------
1  | Ian  | 2,3
2  | Dave | 1
3  | Mike | 1,2

(注意:收藏夹是一个字符串。)

我尝试了以下操作,结果为零行:

SELECT id, name FROM users WHERE id IN (SELECT favourites FROM users WHERE id=1)

查询Ian(id 1)的收藏夹的结果应为

id | name
---------
2  | Dave
3  | Mike

感谢您的光临!

1 个答案:

答案 0 :(得分:2)

请勿将逗号分隔的值用于ID的商店集合
但使用适当的标准化表

table users 
id | name 
-----------
1  | Ian  
2  | Dave 
3  | Mike 

table favorites 
id , id_user, id_favorite 
1, 1, 2
2, 1, 3 
3, 2, 1
4, 3, 1
5, 3, 2

select u.id, u.name 
from users u
inner join  favorites f on f.id_favorite = u.id
where f.id_user = 1 

spencer7593的

编辑

将逗号分隔的值存储在列中是一种反模式。它违反了第一个范式。

要直接回答所提出的问题:可以编写一个返回指定结果的MySQL查询。

MySQL提供了一个FIND_IN_SET函数,该函数返回以逗号分隔的列表中找到的元素的位置。找不到元素时返回零。

我们可以做这样的事情:

SELECT f.id
     , f.name
  FROM users f
  JOIN users u 
    ON FIND_IN_SET(f.id,u.favourites) 
 WHERE u.id = 1
 ORDER
    BY f.id

参考:https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_find-in-set