Mysql 从同一个表中搜索逗号分隔的字符串
如何获取用户最喜爱的id和名称 “用户”表Mysql 从同一个表中搜索逗号分隔的字符串,mysql,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 | 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
谢谢你看 对于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
编辑斯宾塞7593 在列中存储逗号分隔的值是一种反模式。它违反了第一范式 更直接地回答所问的问题:可以编写一个返回指定结果的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
参考:您不应该为id的存储集合使用逗号分隔的值。您应该正确地规范化表相关:当我们执行
selectfavorites
时,返回的是一个字符串,外部查询实际上是在执行其中id='2,3'
查找字符串匹配。逗号分隔符只是字符串中的一个字符。该字符串中的逗号不会解释为SQL文本的一部分。我们可以在(2,3)中执行WHERE-id,但在本例中,逗号是SQL文本中的一个标记,因此对它的解析相当于WHERE-id=2或id=3
。如果我们做whereid IN('2,3')
,这与whereid='2,3'
是一样的。(这应该有助于解释观察到的行为,为什么查询返回零行。)+10这个问题问得很好,提供了示例数据、预期输出和使用的确切SQL文本,这比大多数MySQL问题都要多。OP是询问观察到的行为。这更像是一个问题“为什么我的字符串中的逗号没有被解析为SQL标记”。(答:SQL不会这样做,因为如果它这样做了,SQL会非常糟糕。)请注意,实际上可以从逗号分隔的列表中提取单个元素(达到有限的限制),并编写一个查询,返回给定表的预期结果,如图所示,但SQL很难看。SELECT f.id,f.name FROM users f JOIN users u ON FIND_IN_SET(f.id,u.favorites),其中u.id=1 ORDER BY f.id
ref:@spencer7593感谢有用的编辑。除了说明我的解决方案不起作用的原因(甚至给出一个有效的解决方案),我还学习了规范化,我将使用它。谢谢+10我非常同意逗号分隔列表是反模式违反第一范式每个属性都依赖于键整个键除了键什么都没有所以帮帮我Codd。