2010-05-27 5 views
2

J'utilise MySQL. J'ai une tableCela peut-il être fait avec une seule requête SQL

Type SubType 
1 1 
1 5 
1 6 
1 8 
2 2 
2 3 
3 1 
3 2 
3 3 

Pour chaque type il y a un certain nombre de sous-types. Pour chaque sous-type dans un type il y a un sous-type correspondant dans le type suivant:

(1,1) => (2,2) 
(1,5) => (2,3) 
(1,6) => (2,2) 
(1,8) => (2,3) 
(2,2) => (3,1) 
(2,3) => (3,2) 

Si vous ne l'avez pas vu le modèle, la voici: vous triez les deux types actuels et à venir par le sous-type, puis dans la Ensuite, vous obtenez le sous-type dans la même position que votre sous-type actuel dans le type actuel. S'il y a plus de sous-types dans le type courant que dans le suivant, vous déformer et commencer à partir du premier sous-type dans le type suivant.

Est-il possible de construire une requête qui prend le type et le sous-type actuels et renvoie le sous-type correspondant dans le type suivant?

+0

Voulez-vous que les sous-types d'être toujours dans l'ordre croissant? –

+0

Oui, les sous-types doivent toujours être triés. Transmettre toutes les données au client et les traiter n'est pas une solution viable parce qu'il y en a trop. J'ai implémenté une solution PHP simple qui fait 4 requêtes. Cela fonctionne mais je pense que peut-être il ya un moyen d'éviter d'envoyer des données inutilement. – Ghostrider

Répondre

0

pas sûr de mysql ... dans Oracle il y a des fonctions LEAD et LAG, ainsi que CONNECT BY.

Je suis un peu confus par votre description je dois dire :)

0

Il y a probablement une façon de le faire avec une requête, mais je pense que vous ce serait une meilleure idée de construire une structure de données de la table puis faites vos recherches là-bas. Les requêtes MySQL auxquelles je pense impliqueraient d'obtenir des comptes à partir de sous-requêtes, d'arithmétique modulo, etc. Le résultat final serait une requête désordonnée! Si au contraire, vous aviez quelque chose comme ceci:

En Python rudimentaire:

>>> x = [None, [1, 5, 6, 8], [2, 3], [1, 2, 3]] 
>>> for i in range(1,3): 
... for j in range(len(x[i])): 
...  k = j % len(x[i+1]) 
...  print(i,x[i][j],i+1,x[i+1][k]) 
... 
1 1 2 2 
1 5 2 3 
1 6 2 2 
1 8 2 3 
2 2 3 1 
2 3 3 2 
Questions connexes