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)
当然这也不起作用。所以我不知道如何继续。
解决此问题的一种方法是使用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)
归档时间: |
|
查看次数: |
205 次 |
最近记录: |