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