我使用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 );
它返回列表中的所有名字。我可以使用两个查询来实现这一点,但我想我会仔细检查是否有办法让它与一个简单,优雅的查询一起工作。
感谢阅读,感谢任何帮助。 七月
答案 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 );