MySql - 按名称和合作伙伴

时间:2015-04-25 23:16:51

标签: php mysql sorting grouping

我正在处理MySQL / PHP Web应用程序中的以下问题:

有人看到列的人员表:

ID,firstname,surname,idOfPartner,street,zipCode

应该以该人的姓氏命令,然后由该人的伴侣跟随,以便结果看起来像

人A
A人的伴侣(无论姓氏是什么)
人B
B人的合伙人 ......

我目前正在做一个简单的ORDER BY姓氏,并将它们放在PHP代码中。

目前我的查询只是

SELECT * FROM customers ORDER BY surname, firstname

其余的是在PHP代码中完成的,这非常慢。

这甚至只能在数据库中实现吗?它的表现更好吗?

1 个答案:

答案 0 :(得分:2)

好的,让我们建立起来。

没有合作伙伴的人员名单是:

SELECT a.surname, a.firstname,
       a.surname sortsurname, a.firstname sortfirstname, a.id sortid,
       0 role
  FROM person a

现在我们取得这些人的伙伴。在这个JOIN中,b是合作伙伴。

SELECT b.surname, b.firstname,
       a.surname sortsurname, a.firstname sortfirstname, a.id sortid,
       1 role
  FROM person a
  JOIN person b ON b.id = a.idofpartner

现在我们将这两个表与UNION ALL结合起来,并对排序名称和角色

进行整理
SELECT surname, firstname, role FROM (
SELECT a.surname, a.firstname,
       a.surname sortsurname, a.firstname sortfirstname, a.id sortid,
       0 role
  FROM person a
              UNION ALL
SELECT b.surname, b.firstname,
       a.surname sortsurname, a.firstname sortfirstname, a.id sortid,
       1 role
  FROM person a
  JOIN person b ON b.id = a.idofpartner
 ) both
ORDER BY sortsurname, sortfirstname, sortid, role

这里的技巧是为角色分配0角色,为角色分配角色1,并在结果集中创建额外的列以允许排序。我添加了sortid参数来处理多个人共享名称的情况。