mysql - MySQL中的反向连接

标签 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

-and now I want to create a query, which will return joined records in reverse order:

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 

My approach

I have now this query:

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));

-看这个fiddle示例结构和代码。

一些背景

没有用例。我以前在应用程序中这样做过。现在主要是好奇是否有一种方法可以在 SQL 中做到这一点——这就是为什么我不仅寻求“任何解决方案”(比如我的)——而且寻求尽可能简单的解决方案。源表总是很小(<10.000 条记录)——所以我认为性能不是问题。

问题

能否以某种方式简化我的查询?另外,不要使用变量也很重要。订单可以包含在结果中(就像我的 fiddle 一样)——但这不是强制性的。

最佳答案

我认为唯一需要改进的是

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;

有 2 处更改应该会加快速度:

1) 首先逆序计算正确的顺序

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

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

关于mysql - MySQL中的反向连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19114308/

相关文章:

mysql - SQL - 嵌套连接

sql - 如果数组中的相关表值(postgresql),则在表上设置值

MySql-Json_extract : count elements

php - 下面给出的 insert.php 有问题吗?

php - 如何解决这个模棱两可的问题?

sql - 在 Oracle (11.2 之前) : When using cast(collect(. ..)) 中,如何对结果进行排序?

php - 错误 : Join in MySql, PHP

mysql - 如何改善MariaDB索引表的慢查询?

mysql - 关闭查询MYSQL的查询

MySQL如何填充范围内缺失的日期?