我使用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)
它返回列表中的所有名字.我可以使用两个查询来实现这一点,但我想我会仔细检查是否有办法让它与一个简单,优雅的查询一起工作.
感谢阅读,任何帮助表示赞赏.七月
这似乎是一个非常糟糕的桌面设计.是否有可能改变它?
如果您无法更改设计,则可以使用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)
但是,我强烈建议您尽可能规范数据库,而不是走这条路.考虑使用连接表而不是逗号分隔列表.然后,您可以使用联接找到所需的条目,搜索将能够使用索引.
你能改变这个数据库结构吗?联系人字段实际上应该是一个相关的表而不是列。假设联系人表具有以下结构:
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)
| 归档时间: |
|
| 查看次数: |
3881 次 |
| 最近记录: |