在MySQL中反向加入

Alm*_* Do 12 mysql sql join sql-order-by

所以,

问题

我的问题是 - 如何以相反的顺序将MySQL中的表连接起来?假设我有:

id  name
1   First
2   Second
5   Third
6   Fourth
7   Fifth
8   Sixth
9   Seventh
13  Eight
14  Nine
15  Tenth

- 现在我想创建一个查询,它将以相反的顺序返回连接的记录:

left_id name    right_id    name 
   1    First      15   Tenth 
   2    Second     14   Nine 
   5    Third      13   Eight 
   6    Fourth      9   Seventh 
   7    Fifth       8   Sixth 
   8    Sixth       7   Fifth 
   9    Seventh     6   Fourth 
  13    Eight       5   Third 
  14    Nine        2   Second 
  15    Tenth       1   First 

我的方法

我现在有这个查询:

SELECT 
  l.id AS left_id, 
  l.name, 
  (SELECT COUNT(1) FROM sequences WHERE id<=left_id) AS left_order, 
  r.id AS right_id,
  r.name,
  (SELECT COUNT(1) FROM sequences WHERE id<=right_id) AS right_order 
FROM 
  sequences AS l 
  LEFT JOIN 
    sequences AS r ON 1
HAVING
  left_order+right_order=(1+(SELECT COUNT(1) FROM sequences));
Run Code Online (Sandbox Code Playgroud)

- 看看这个样本结构和代码的小提琴.

一些背景

没有用例.我以前在应用程序中这样做.现在,如果有一种方法可以在SQL中实现这一点,那就是好奇心 - 这就是为什么我不仅仅寻求'任何解决方案'(就像我的) - 而是尽可能简单的解决方案.源表总是很小(<10.000条记录) - 所以我认为性能不是一件值得关注的事情.

这个问题

我的查询能以某种方式简化吗?此外,重要的是不要使用变量.订单可以包含在结果中(比如我的小提琴) - 但这不是强制性的.

Tha*_*kis 2

我认为唯一需要改进的是

SELECT 
  l.id AS left_id, 
  l.name ln, 
  (SELECT COUNT(1) FROM sequences WHERE id<=left_id) AS left_order, 
  r.id AS right_id,
  r.name rn,
  (SELECT COUNT(1) FROM sequences WHERE id>=right_id) AS right_order 
FROM 
  sequences AS l 
  LEFT JOIN 
    sequences AS r ON 1
HAVING
  left_order=right_order;
Run Code Online (Sandbox Code Playgroud)

有 2 个更改应该会使速度更快一些:

1)首先逆序计算正序

2)避免SELECT COUNT在最后一行使用。

编辑:我给 ln,rn 起了别名,因为我看不到小提琴中的列