mysql选择输入,后跟逗号分隔字段

mysql选择输入,后跟逗号分隔字段,mysql,list,nested,Mysql,List,Nested,我使用mySQL,我有一个成员表,其中有一个BLOB“contacts”字段,包含一个逗号分隔的其他成员ID列表: TABLE members: id_member = 1 firstname = 'John' contacts (BLOB) = '4,6,7,2,5' 我想通过一个查询检索个人“联系人”列表中的所有名字。我尝试了以下方法: SELECT firstname from members WHERE id_member IN ( SELECT contacts FROM membe

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

TABLE members:
id_member = 1
firstname = 'John'
contacts (BLOB) = '4,6,7,2,5'
我想通过一个查询检索个人“联系人”列表中的所有名字。我尝试了以下方法:

SELECT firstname from members WHERE id_member IN ( SELECT contacts FROM members WHERE id_member = 1 );
它只返回一行,但当我尝试时:

SELECT firstname from members WHERE id_member IN ( 4,6,7,2,5 );
它返回列表中的所有名字。我可以使用两个查询来实现这一点,但我想我应该仔细检查是否有一种方法可以通过一个简单、优雅的查询来实现

谢谢你的阅读,谢谢你的帮助。
七月

那似乎是一个非常糟糕的桌子设计。有可能改变吗

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

SELECT firstname
FROM members
WHERE FIND_IN_SET(id_member, (SELECT contacts FROM members WHERE id_member = 1))

但如果可能的话,我强烈建议你不要走这条路。考虑使用一个代替逗号分隔的列表。然后,您可以通过使用联接找到所需的条目,搜索将能够使用索引。

如果您使用序列化的
BLOB
类型列来存储这些值,那么您将无法执行所需的操作。一种更为SQL友好的方法是创建一个关系表,该关系表可以用作
JOIN
操作的一部分,例如
member\u contacts
表,该表在一个
id\u成员
值和其他一些值之间具有关联


将逗号分隔的列表扩展为单个记录是一个非常简单的机械过程。

您能更改此数据库结构吗?contacts字段实际上应该是一个相关的表,而不是一列。假设联系人表具有此结构:

id_contact
id_member
然后您将使用EXISTS:

SELECT firstname from members m WHERE EXISTS (SELECT 1 FROM contacts c WHERE c.id_contact = m.id_member );

您的ID是数字,而您的blob是字符串吗?这里的解决方案是使用contacts表正确地规范化数据库,该表有两列:
ID\u member
ID\u contact
,每个
ID\u member
都有许多行。是的,Jrod,我的ID是INT,blob是字符串。谢谢你的想法,Michael,但是我保留了我在对Tadman回答的评论中表达的这个选项。我不知道
FIND_in_SET
,但我打赌在大型数据集上这会非常慢,因为它会导致自动表扫描,并且无法索引。不过这是一个很好的技巧。谢谢你的研究链接,非常有用。谢谢大家的回复,我要去参加一个聚会。我考虑过这种方法,但是收集单个成员的联系人列表需要浏览一个包含每个人的联系人条目的表的想法似乎效率低下。如果你在你的
WHERE
子句中使用的
id\u成员
上建立索引,这实际上是非常快的,即使在大数据集上也是如此。对任何频繁的查询都要有索引。谢谢,我最后做的就是这样。这是一个好看的查询。我要找一张相关的桌子,谢谢你的帮助