【发布时间】:2017-02-28 12:07:27
【问题描述】:
有 2 个表格 - 联系人和消息:
contact_id | contact_email
1 | some@mail.com
2 | other@mail.com
3 | no@nono.com
message_id | message_recipients
1 | 1,2,3
2 | 3
message_recipients 字段包含已分配给联系人的 ID。每条消息都可以分配一个或多个 ID,因此它们之间用, 符号分隔。
我需要显示所有联系人,并将消息数分配给每个联系人。由于message_recipients 字段可能包含多个ID,因此我无法运行SELECT * FROM contacts, messages WHERE contacts.contact_id=messages.message_recipients 之类的查询,因为它无法正常工作。
如果我运行SELECT * FROM contacts FULL JOIN messages,它会从contacts 表中返回许多重复的行。当然,我可以运行SELECT * FROM contacts FULL JOIN messages GROUP BY contact_id,但这个只返回来自messages 表的第一条消息。
我知道,为了计算每个联系人分配了多少条消息,我可能需要将每行中的 message_recipients 字段分解为数组,并使用 if (in_array($contact_id, $message_recipients_array)) {$total++;} 之类的代码或类似代码。现在我主要关心的是如何通过编写尽可能简单的查询来满足我的所有需求。
【问题讨论】:
-
修复你的表结构。 不要在一个单元格中存储多个值。见Normalization
-
任何 cmets 应该是什么样子?当然,我总是可以在 message_recipients 字段中存储一个 id,但在这种情况下,messages 表将填充数百条重复记录(其中只有 ID 字段会不同,而包含消息文本和其他详细信息的字段将是相同的)。我认为这不是一个好习惯。