Combiner 3 requètes [résolu]

Combiner 3 requètes [résolu] - SQL/NoSQL - Programmation

Marsh Posté le 13-12-2006 à 16:46:03    

Bonjour,
je voudrais faire une requete mysql qui va me chercher les données relatives a un identifiant.
 
Jusque là rien de compliqué,
mais je voudrais que cette même requete me trouve l'identifiant inférieur et supérieur.
 
il faudrait en quelque sorte combiner ces 3 requetes:

Code :
  1. SELECT champ1, champ2
  2. FROM table
  3. WHERE id='2'
  4. SELECT id as id_inf
  5. FROM table
  6. WHERE id < '2'
  7. LIMIT 0,1
  8. ORDER BY id DESC
  9. SELECT id as id_sup
  10. FROM table
  11. WHERE id > '2'
  12. LIMIT 0,1
  13. ORDER BY id ASC


 
How do this ?  :??:


Message édité par papanoramix le 14-12-2006 à 15:09:11
Reply

Marsh Posté le 13-12-2006 à 16:46:03   

Reply

Marsh Posté le 13-12-2006 à 16:56:39    


select id, champ1, champ2
from table
where id = (select max(id) from table where id < 2)
union all
select id, champ1, champ2
from table
where id = (select min(id) from table where id > 2)


 
:spamafote:

Reply

Marsh Posté le 13-12-2006 à 17:03:00    

D'accord, mais là il va me retourner une ligne contenant 'champ1', 'champ2' et 'id' pour l'id inferieur, l'id superieur et l'id demandé.
 
Le plus simple pour moi serait de récuperer une seule ligne contenant toutes ces infos: champ1, champ2, id, id_superieur, id_inferieur

Reply

Marsh Posté le 13-12-2006 à 17:07:09    

Code :
  1. select A.f1, A.f2, B.f3, B.f4, C.f5, C.f6 from (    SELECT champ1 , champ2 FROM table  WHERE id='2') as A, (...id < 2) as B, ( ...id>2 ) as C


mais c'est pas bo :o

Reply

Marsh Posté le 13-12-2006 à 17:10:57    

anapajari a écrit :

Code :
  1. select A.f1, A.f2, B.f3, B.f4, C.f5, C.f6 from (    SELECT champ1 , champ2 FROM table  WHERE id='2') as A, (...id < 2) as B, ( ...id>2 ) as C


mais c'est pas bo :o


c'est même pire que ça, parceque si tu fais juste des >2 et <2, tu ramènes toute la base ;)
donc faut refoutre des limit partout, ou des sous-sous-requête avec des max et min comme mon exemple.
 
ça devient clairement pas beau :D

Reply

Marsh Posté le 13-12-2006 à 17:15:15    

ya pas un truc vachement beau tout simple ? ;)

Reply

Marsh Posté le 13-12-2006 à 17:18:49    

ben si les id sont séquenciels et sans trous (truc impossible à garantir généralement), tu peux faire id + 1 et id - 1 au lieu de <2 et >2 ce sera déjà moins pire...

Reply

Marsh Posté le 13-12-2006 à 17:19:56    

Oui, j'y ai bien pensé... mais si on suprime une de ces lignes bonjour les dégats...

Reply

Marsh Posté le 13-12-2006 à 17:20:51    

bah ouais (d'où le "truc impossible à garantir généralement" ;))

Reply

Marsh Posté le 13-12-2006 à 17:22:06    

sinon, avec Oracle ou SQL Server, tu peux utiliser des fonctions analytiques pour faire ça. Mais à mon avis les requêtes seront aussi pourries, et en plus tu vas récupérer des infos dont t'as pas besoin (genre un cumul progressif ou autre)

Reply

Marsh Posté le 13-12-2006 à 17:22:06   

Reply

Marsh Posté le 13-12-2006 à 17:32:20    

MagicBuzz a écrit :

ça devient clairement pas beau :D

je savais que ça te plairait  :wahoo: ( mais pour les instructions qui manquent c'était flemme inside hein)
 
sinon tu prends les 3 premiers qui sont >= au min de ceux qui sont inférieurs à la valeur fixe.
Mais c'est pas encore super!

Reply

Marsh Posté le 13-12-2006 à 17:34:26    

http://sqlpro.developpez.com/SQL_Server_2K5/N1.php
 
si mysql a le même genre de fonctions que le 1.7, alors y'a moyen de moyenner avec RANK()

Reply

Marsh Posté le 14-12-2006 à 11:24:31    

je vois pas là ...

Reply

Marsh Posté le 14-12-2006 à 12:37:25    

Code :
  1. SELECT champ1,
  2.        champ2,
  3.        (SELECT max(id) FROM maTable WHERE id < mt.id) AS id_precedent,
  4.        (SELECT min(id) FROM maTable WHERE id > mt.id) AS id_suivant
  5. FROM   maTable mt
  6. WHERE  id = 2;

Reply

Marsh Posté le 14-12-2006 à 14:21:20    

tiens, je viens de m'appercevoir que j'avais mal lu la question depuis le départ :pt1cable:

Reply

Marsh Posté le 14-12-2006 à 15:08:43    

Cool, pourquoi se prendre le chou ?
 
merci :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed