我必须表、联系人
和群组
。
在 contacts
内部,我有 3 列: id
first_name
last_last
在 groups
内,我有 2 列:id
linked
我想将联系人分组。因此,我认为最好的方法是,当您将联系人添加到群组时,它会将该联系人 ID 添加到链接
列中以逗号分隔的联系人 ID 列表中。
因此,如果您将联系人 1、4、14 和 24 添加到特定组,则链接
列将具有此值1,4,14,24
现在我想显示该组中的联系人。因此,我 explode()
链接的值,然后使用 foreach()
循环遍历分解的数组,并在每个循环中通过 MySQL 选择该联系人的名字和姓氏并显示它。
所有这些都运行良好。我的问题是我意识到我想对该组中显示的联系人进行排序。但它们按照它们在组中的放置顺序显示。
我希望能够按名字升序或降序排序,但我不知道如何排序,因为我在 foreach()
中选择每个联系人并回显它。
附注我想也许可以在联系人上创建一个名为 groups
的列,并以与存储组中所有联系人相同的方式存储该联系人的所有组。因此,如果联系人属于组 1、2、4 和 6,则该联系人 groups
列的值为 1,2,4,6
。唯一的问题是,假设我正在搜索第 6 组中的所有联系人,我如何在 MySQL 语句中搜索该列表?我认为最好的方法是从联系人中选择first_name WHERE groups LIKE '%6%'
,但是如果联系人位于组 60 中怎么办?即使该联系人不在正确的组中,它是否也会选择该联系人?
最佳答案
不要在数据库的同一字段中存储多个值!正如您所观察到的,当您想要单独处理每个值时,您会遇到问题。
在您的情况下,在组表中为该人所属的每个组插入一行。连接两个表以按照您想要的方式获取信息。
例如:查找圣诞老人属于哪些群体:
SELECT groups.id
FROM contacts
INNER JOIN groups
ON groups.linked = contacts.id
WHERE firstname = 'Santa' AND lastname = 'Claus'
或者查找第 1 组中的人员:
SELECT firstname, lastname
FROM contacts
INNER JOIN groups
ON groups.linked = contacts.id
WHERE groups.id = 1
ORDER BY lastname, firstname
要获取以逗号分隔的列表形式的结果,您可以使用 GROUP_CONCAT
函数:
SELECT groups.id,
GROUP_CONCAT(firstname, ' ', lastname
ORDER BY lastname SEPARATOR ', ') AS groups
FROM contacts
INNER JOIN groups
ON groups.linked = contacts.id
GROUP BY groups.id
为了存储组名称,您可能会受益于使用 3 个表
联系方式(ID、名字、姓氏)
群组(id、群组名称)
Group_membership(contact_id、group_id)
关于PHP/MySQL : Sorting Results a Different Way,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15425291/