【问题标题】:MySql - Sort persons by name and partnerMySql - 按姓名和合作伙伴对人员进行排序
【发布时间】:2015-07-04 11:49:48
【问题描述】:

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

查看有列的人员表:

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

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

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

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

目前我的查询很简单

SELECT * FROM customers ORDER BY surname, firstname

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

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

【问题讨论】:

  • 您可以发布您的查询吗?
  • 目前我的查询只是 SELECT * FROM customers ORDER BY surname, firstname。其余的都是在 php 代码中完成的,这真的很慢
  • 客户表上有哪些索引?
  • 我在 id 上有一个主键,而 idOfPartner 是一个可以为空的 int,其索引和外键指向合作伙伴的 id

标签: php mysql sorting grouping


【解决方案1】:

好的,让我们构建它。

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

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 参数来处理多人同名的情况。

【讨论】:

    猜你喜欢
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多