2010-09-04 5 views
1

J'ai le tableau suivant:SQL :: Self joindre une table pour satisfaire une condition particulière?

mysql> SELECT * FROM temp; 
+----+------+ 
| id | a | 
+----+------+ 
| 1 | 1 | 
| 2 | 2 | 
| 3 | 3 | 
| 4 | 4 | 
+----+------+ 

Je suis en train d'obtenir la sortie suivante:

+----+------+------+ 
| id | a | a | 
+----+------+------+ 
| 1 | 1 | 2 | 
| 2 | 2 | 3 | 
| 3 | 3 | 4 | 
+----+------+------+ 

mais je rencontre un petit problème. J'ai écrit la requête suivante:

mysql> SELECT A.id, A.a, B.a FROM temp A, temp B WHERE B.a>A.a; 

mais ma sortie est la suivante:

+----+------+------+ 
| id | a | a | 
+----+------+------+ 
| 1 | 1 | 2 | 
| 1 | 1 | 3 | 
| 2 | 2 | 3 | 
| 1 | 1 | 4 | 
| 2 | 2 | 4 | 
| 3 | 3 | 4 | 
+----+------+------+ 

Quelqu'un peut-il me dire comment convertir en la sortie désirée? J'essaie d'obtenir un formulaire où seules les valeurs consécutives sont produites. Je veux dire, si 2 est supérieur à 1 et 3 est supérieur à 2, je ne veux pas 3 est supérieur à 1.

+0

sont les nombres dans 'consécutifs sans a' lacunes ou tout simplement ordonné et peut avoir des lacunes? –

+0

@Martin: Oh .. non, ils ne doivent pas être consécutifs. Ils peuvent avoir des lacunes. – Legend

+0

@OMG: Oui. Si c'est ce qu'ils appellent ceci :) – Legend

Répondre

3

Option 1: "Triangular Rejoindre" - Quadratique complexité

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

Option 2: "Pseudo ROW_NUMBER()" - complexité linéaire

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 
+0

+1: Bien fait. –

+0

Lorsque j'exécute votre requête, j'obtiens une seule ligne: 4, 4,1. Est-ce que je fais quelque chose de mal? – Legend

+0

@legend - J'avais besoin d'utiliser un nom de variable différent dans 'option2'. Je pensais que ce serait réinitialisé mais clairement pas. Fixé maintenant! Vous trouverez peut-être que cette deuxième version fonctionne mieux si vous avez une grande table car la charge de travail croîtra linéairement et non quadratiquement comme dans l'option 1. –

Questions connexes