MySql - 按姓名和合作伙伴对人员进行排序

MySql - Sort persons by name and partner

我在 MySQL/PHP 网络应用程序中处理以下问题:

table 个人正在寻找以下专栏:

ID、名字、姓氏、idOfPartner、街道、邮政编码

应按此人的姓氏排序,然后按此人的伴侣排序,这样结果看起来像

A 人
A人的合伙人(无论姓氏以什么开头)

B人的合伙人
...

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

目前我的查询只是

SELECT * FROM customers ORDER BY surname, firstname

其余部分在 php 代码中完成,这真的很慢。

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

好的,让我们构建它。

没有伴侣的人员名单是:

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 参数来处理多人共用一个名字的情况。