mysql SELECT IN后跟逗号分隔字段

bob*_*ope 5 mysql nested list

我使用mySQL,我有一个成员表,其中包含一个BLOB'contacts'字段,其中包含逗号分隔的其他成员ID列表:

TABLE members:
id_member = 1
firstname = 'John'
contacts (BLOB) = '4,6,7,2,5'
Run Code Online (Sandbox Code Playgroud)

我想通过一个查询检索个人"联系人"列表中的所有名字.我尝试了以下方法:

SELECT firstname from members WHERE id_member IN ( SELECT contacts FROM members WHERE id_member = 1 );
Run Code Online (Sandbox Code Playgroud)

它只返回一行,但是当我尝试时:

SELECT firstname from members WHERE id_member IN ( 4,6,7,2,5 );
Run Code Online (Sandbox Code Playgroud)

它返回列表中的所有名字.我可以使用两个查询来实现这一点,但我想我会仔细检查是否有办法让它与一个简单,优雅的查询一起工作.

感谢阅读,任何帮助表示赞赏.七月

Mar*_*ers 6

这似乎是一个非常糟糕的桌面设计.是否有可能改变它?

如果您无法更改设计,则可以使用MySQL处理逗号分隔值,FIND_IN_SET但无法有效使用索引:

SELECT firstname
FROM members
WHERE FIND_IN_SET(id_member, (SELECT contacts FROM members WHERE id_member = 1))
Run Code Online (Sandbox Code Playgroud)

但是,我强烈建议您尽可能规范数据库,而不是走这条路.考虑使用连接表而不是逗号分隔列表.然后,您可以使用联接找到所需的条目,搜索将能够使用索引.


dav*_*ell 2

你能改变这个数据库结构吗?联系人字段实际上应该是一个相关的表而不是列。假设联系人表具有以下结构:

id_contact
id_member
Run Code Online (Sandbox Code Playgroud)

那么你可以使用 EXISTS 来代替:

SELECT firstname from members m WHERE EXISTS (SELECT 1 FROM contacts c WHERE c.id_contact = m.id_member );
Run Code Online (Sandbox Code Playgroud)