mysql SELECT IN后跟逗号分隔字段

时间:2012-02-23 19:38:37

标签: 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 members WHERE id_member = 1 );

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

SELECT firstname from members WHERE id_member IN ( 4,6,7,2,5 );

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

感谢阅读,感谢任何帮助。 七月

3 个答案:

答案 0 :(得分:6)

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

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

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

但是,不是走这条路,我强烈 强烈建议你normalize your database。请考虑使用join table而不是逗号分隔列表。然后,您可以使用联接找到所需的条目,搜索将能够使用索引。

答案 1 :(得分:3)

如果您使用序列化的BLOB类型列来存储这些值,那么您将无法执行所需的操作。更友好的SQL方法是创建一个可用作JOIN操作一部分的关系表,例如member_contacts表,其中一个id_member值与其他值相关联

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

答案 2 :(得分:2)

您可以更改此数据库结构吗? 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 );