SQL::自联接表以满足特定条件?

SQL::自联接表以满足特定条件?,sql,mysql,Sql,Mysql,我有下表: mysql> SELECT * FROM temp; +----+------+ | id | a | +----+------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | | 4 | 4 | +----+------+ 我正在尝试获得以下输出: +----+------+------+ | id | a | a | +----+------+------+ | 1 | 1 | 2 |

我有下表:

mysql> SELECT * FROM temp;
+----+------+
| id | a    |
+----+------+
|  1 |    1 | 
|  2 |    2 | 
|  3 |    3 | 
|  4 |    4 | 
+----+------+
我正在尝试获得以下输出:

+----+------+------+
| id | a    | a    |
+----+------+------+
|  1 |    1 |    2 | 
|  2 |    2 |    3 | 
|  3 |    3 |    4 | 
+----+------+------+
但是我有一个小问题。我编写了以下查询:

mysql> SELECT A.id, A.a, B.a FROM temp A, temp B WHERE B.a>A.a;
但我的输出如下:

+----+------+------+
| id | a    | a    |
+----+------+------+
|  1 |    1 |    2 | 
|  1 |    1 |    3 | 
|  2 |    2 |    3 | 
|  1 |    1 |    4 | 
|  2 |    2 |    4 | 
|  3 |    3 |    4 | 
+----+------+------+
有人能告诉我如何将其转换为所需的输出吗?我试图得到一个只生成连续值的表单。我的意思是,如果2大于1,3大于2,我不希望3大于1。

选项1:“三角连接”-二次复杂度

 SELECT A.id, A.a, MIN(B.a) AS a 
 FROM temp A 
     JOIN temp B ON B.a>A.a 
 GROUP BY A.id, A.a;`
select a_numbered.id, a_numbered.a, b_numbered.a
from 
(
select id,
       a,
       @rownum := @rownum + 1 as rn
  from temp
  join (select @rownum := 0) r
order by id

) a_numbered join (
select id,
       a,
       @rownum2 := @rownum2 + 1 as rn
  from temp
  join (select @rownum2 := 0) r
order by id

) b_numbered 
on b_numbered.rn = a_numbered.rn+1
选项2:“伪行数()”-线性复杂度

 SELECT A.id, A.a, MIN(B.a) AS a 
 FROM temp A 
     JOIN temp B ON B.a>A.a 
 GROUP BY A.id, A.a;`
select a_numbered.id, a_numbered.a, b_numbered.a
from 
(
select id,
       a,
       @rownum := @rownum + 1 as rn
  from temp
  join (select @rownum := 0) r
order by id

) a_numbered join (
select id,
       a,
       @rownum2 := @rownum2 + 1 as rn
  from temp
  join (select @rownum2 := 0) r
order by id

) b_numbered 
on b_numbered.rn = a_numbered.rn+1

a
中的数字是连续的,没有空格,还是只是排序,可能有空格?@Martin:Oh。。不,它们不必是连续的。他们可能有差距。@OMG:是的。如果这就是他们所说的:)
从temp A中选择A.id、A.A、B.A,temp B其中B.A>A.A按A.A分组似乎给了我想要的,但不确定这是否正确。。。有什么评论吗?呃,实际上我认为
选择A.id,A.A,MIN(B.A)作为A从临时A加入临时B.A>A.A组A.id,A.A选项2
中使用不同的变量名。我以为它会被重置,但显然不是。现在修好了!您可能会发现,如果您有一个较大的表,那么第二个版本的性能会更好,因为工作负载将线性增长,而不是像选项1中的二次增长。非常感谢您和+1的解释!)