PHP/MySQL : Sorting Results a Different Way

标签 php mysql

我必须表、联系人群组
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/

相关文章:

php - 自动完成搜索框,从结果中选择多个值

php - Laravel:通过 AJAX 无表单发送数据到 Controller

php - 如何在 mysql select 语句上连接 4 个表?

php - 拉出 Oracle CLOB 与 VARCHAR2 不同吗?

mysql - SQL 连接或合并结果?

mysql - CASE 语句不起作用

mysql - 如何在cakephp3中使用phinx迁移更改列时设置tinyint,smallint类型的可见长度?

php - 要求我的网站每两分钟运行一个 cron 脚本是不是糟糕的设计?

android - 在ListView中添加搜索: crashed when typing word

mysql - INNER JOIN 的查询优化