0

我必须表,contactsgroups
里面contacts我有 3 列:id first_name last_last
里面groups我有 2 列:id linked

我想将联系人分组。所以我认为最好的方法是,当您将联系人添加到组时,它会将联系人 ID 添加到列中以逗号分隔的联系人 ID 列表中linked

因此,如果您将联系人 1、4、14 和 24 添加到特定组,则该linked列将具有此值1,4,14,24

现在我想显示该组中的联系人。所以我explode()linked值,然后使用 aforeach()在展开的数组中循环,并在每个循环中通过 MySQL 选择该联系人的名字和姓氏并显示它。

所有这些工作正常。我的问题是我意识到我想对该组中显示的联系人进行排序。但它们按照它们在组中的排列顺序显示。

我希望能够按名字升序或降序排序,但我不知道如何排序,因为我选择了 a 中的每个联系人foreach()并对其进行回显。

PS我想可能会在联系人上创建一个列groups并存储联系人的所有组,就像我存储组中的所有联系人一样。因此,如果联系人位于组 1、2、4 和 6 中,则该联系人groups列的值为1,2,4,6。唯一的问题是,假设我正在搜索第 6 组中的所有联系人,我如何在 MySQL 语句中搜索该列表?我认为最好的方法是SELECT first_name FROM contacts WHERE groups LIKE '%6%',但是如果联系人在第 60 组中怎么办?即使它不在正确的组中,它也不会选择该联系人吗?

4

1 回答 1

1

不要在数据库的同一字段中存储多个值!正如您所观察到的,当您想分别处理每个值时会遇到问题。

在您的情况下,为该人所属的每个组在组表中插入一行。将两个表连接起来,以您想要的方式获取信息。

例如:查找圣诞老人所属的组:

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,组名)

Group_membership (contact_id, group_id)

于 2013-03-15T08:38:20.667 回答