按列 UNION,或以不同的顺序对 SELECT/JOIN 查询的两列进行排序

m. *_*ekk 1 mysql order-by select

我有一个表 ,employee其中一列是last_name,它存储字符串。

使用 SELECT 查询,我试图获取last_name按字母顺序排序的列,作为一列,然后再次获取另一列,last_name这次按相反的字母顺序排序。

期望的结果看起来像

+-----------------+----------------+
| last name       | last name      |
+-----------------+----------------+
|  Apple          | Xylophone      |
+-----------------+----------------+
Run Code Online (Sandbox Code Playgroud)

我努力了

SELECT a.last_name, b.last_name
FROM employee A
LEFT JOIN employee B
ON a.last_name = b.last_name
ORDER BY a.last_name, b.last_name DESC;
Run Code Online (Sandbox Code Playgroud)

当然,这是行不通的,因为它按last_name按字母顺序对两列进行排序,甚至没有达到其他顺序条件,因为语法指定n仅当某些行在条件下相等时才使用条件n-1

在我的脑海里,我认为这就像

SELECT last_name 
FROM employee 
ORDER BY last_name;
Run Code Online (Sandbox Code Playgroud)

SELECT last_name 
FROM employee 
ORDER BY last_name DESC;
Run Code Online (Sandbox Code Playgroud)

但我不知道如何将两者结合起来。当我联合这两个查询时,我得到了正确的数据,但它是以两列连接成一列的形式,当我需要两列保持不同时。

我在这里尝试使用 JOIN,这完全是在黑暗中进行的,因为我从未见过这样的语法:

(SELECT a.last_name 
FROM employee a 
ORDER BY a.last_name 
LIMIT 1) 
LEFT JOIN 
(SELECT b.last_name 
FROM employee b 
ORDER BY b.last_name DESC 
LIMIT 1) 
ON a.last_name = b.last_name;
Run Code Online (Sandbox Code Playgroud)

当然这也不起作用。所以我不知道如何继续。

ype*_*eᵀᴹ 6

解决此问题的一种方法是使用ROW_NUMBER()MySQL 8.0 版中提供的函数。我们可以在两个子查询(派生表或 CTE)中获取具有不同顺序的行号,然后将它们连接起来。

在dbfiddle.uk测试:

WITH 
  a AS
  ( SELECT 
        last_name,
        ROW_NUMBER() OVER (ORDER BY last_name) AS rn
    FROM employee 
  ),
  d AS
  ( SELECT 
        last_name,
        ROW_NUMBER() OVER (ORDER BY last_name DESC) AS rn
    FROM employee 
)
SELECT
    a.last_name AS last_name_a,
    d.last_name AS last_name_d
FROM a JOIN d USING (rn) ;
Run Code Online (Sandbox Code Playgroud)