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条记录) - 所以我认为性能不是一件值得关注的事情.
这个问题
我的查询能以某种方式简化吗?此外,重要的是不要使用变量.订单可以包含在结果中(比如我的小提琴) - 但这不是强制性的.
我认为唯一需要改进的是
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 起了别名,因为我看不到小提琴中的列