Aider moi pour une requete

Aider moi pour une requete - SQL/NoSQL - Programmation

Marsh Posté le 26-11-2004 à 10:58:43    

Voilà je n'arrive pas à faire une requete SQL pour mysql
J'ai 2 tables X et Y
Je veux séléctionner tous les enregistrements de la table X qui posséde la valeur C. Le resultat me donne donc enregistrement de X 1, enregistrement de X 2, ..., enregistrement de X n.  
Ensuite je veux sélectionner tous les enregistrement de la table Y qui posséde la clé des enregistrements de X 1, enregistrement de X 2, ..., enregistrement de X n.
Ca doit donc me donner: enregistrement de Y 1, enregistrement de Y 2, ..., enregistrement de Y n.  
Pour finir je veux séléctionner que les 5 premiers enregistrements de ce dernier resultat ayant la valeur date la plus élevée.
 
Voila est-ce que c'est possible en une seule requete ? si oui aidez moi car je n'y arrive pas. Je ne peux pas passer par une boucle PHP car étant donné le nombre de resultat énorme ça va faire beaucoup trop de requete...

Reply

Marsh Posté le 26-11-2004 à 10:58:43   

Reply

Marsh Posté le 26-11-2004 à 11:25:48    

il faudrait que tu décrives mieux les tables
mais a priori ça parait possible

Reply

Marsh Posté le 26-11-2004 à 11:57:13    

krolours1 a écrit :

il faudrait que tu décrives mieux les tables
mais a priori ça parait possible


Voilà j'ai fait ça, en esperant que vous allez pouvoir m'aider

Code :
  1. table x
  2. +----+-----+
  3. | id | val |
  4. +----+-----+
  5. | 1  | A   |
  6. | 2  | C   |
  7. | 3  | A   |
  8. | 4  | C   |
  9. | 5  | C   |
  10. +----+-----+
  11. table Y
  12. +-------+--------+-----------+
  13. |  id   |id de X |    date   |
  14. +-------+--------+-----------+
  15. |   1   |   5    | Avril 2004|
  16. |   2   |   1    | JUIN 2004 |
  17. |   3   |   4    | Avril 2004|
  18. |   4   |   2    | Aout 2004 |
  19. |   5   |   1    | JUIN 2004 |
  20. |   6   |   4    | Avril 2004|
  21. |   7   |   3    | JUIN 2004 |
  22. |   8   |   4    | Mars 2004 |
  23. |   9   |   4    | Avril 2004|
  24. +-------+--------+-----------+


 
Donc si je récapitule par ordre chrono
ma requete doit donc sélectionner les enregistrements 2,4,5 de la table X
Ensuite elle doit donc selectionner les enregistrements 1, 3, 4, 6, 8, 9 de la table Y.
Et donc au final me ressortir  les 5 enregistrements de Y les plus récents soit: 1,3, 4, 6, 9.
 
Je vous remercie par avance  :hello:
 
edit: j'ai eu tort de mettre mes dates sous ce format mais je vous rassure elles sont bien de la forme aaaa-mm-jj dans ma table


Message édité par Scarf3ss3 le 26-11-2004 à 12:00:08
Reply

Marsh Posté le 26-11-2004 à 12:16:52    

Salut,
 
voilà une requête pour l'enregistrement de Y le plus récent:
 
select Y.id
from X, Y
where Y.id_de_x = X.id
and Y.date = (select max(Y1.date) from Y Y1
  where Y.Id = Y1.Id)
and X.val = 'C'
 
 Pour les cinq c'est un peu plus chaud, et je peux pas trop t'aider plus par manque de temps, désolé ...
 
Bonne chance, Tchussy

Reply

Marsh Posté le 26-11-2004 à 12:24:17    

Mattioux a écrit :

Salut,
 
voilà une requête pour l'enregistrement de Y le plus récent:
 
select Y.id
from X, Y
where Y.id_de_x = X.id
and Y.date = (select max(Y1.date) from Y Y1
  where Y.Id = Y1.Id)
and X.val = 'C'
 
 Pour les cinq c'est un peu plus chaud, et je peux pas trop t'aider plus par manque de temps, désolé ...
 
Bonne chance, Tchussy


Merci je vais essayer, si ça marche il me suffira de faire un ORDER BY date DESC LIMIT 5
Je vous tiens au courant


Message édité par Scarf3ss3 le 26-11-2004 à 12:24:29
Reply

Marsh Posté le 26-11-2004 à 16:51:35    

:heink:
 
SELECT Y.id
FROM Y, X
WHERE X.val = 'C'
AND Y.id_de_X = X.id
ORDER BY Y.date desc
LIMIT 5
 
Ca suffit [:spamafote]


Message édité par Arjuna le 26-11-2004 à 16:52:03
Reply

Marsh Posté le 26-11-2004 à 17:37:13    

Arjuna a écrit :

:heink:
 
SELECT Y.id
FROM Y, X
WHERE X.val = 'C'
AND Y.id_de_X = X.id
ORDER BY Y.date desc
LIMIT 5
 
Ca suffit [:spamafote]


 :jap:  
Merci infiniment ça fonctionne nickel !
Dernière question qui n'a rien à voire.
Est-ce qu'à chacune de vos requetes vous faites apres un mysql_free_result pour libérer la mémoire ? Si non vous le faites quand ?

Reply

Marsh Posté le 26-11-2004 à 18:56:51    

Moi je fais un rs.Close et un Set rs = Nothing, mais c'est pas du PHP :D

Reply

Marsh Posté le 01-12-2004 à 21:41:02    

Murat a écrit :

tu peut en dire plus stp ? ca m'interesse  :??:


 
c'est de l'ASP ;)

Reply

Marsh Posté le 01-12-2004 à 22:04:50    

Mattioux a écrit :

Salut,
 
voilà une requête pour l'enregistrement de Y le plus récent:
 
select Y.id
from X, Y
where Y.id_de_x = X.id
and Y.date = (select max(Y1.date) from Y Y1
  where Y.Id = Y1.Id)
and X.val = 'C'
 
 Pour les cinq c'est un peu plus chaud, et je peux pas trop t'aider plus par manque de temps, désolé ...
 
Bonne chance, Tchussy


 
a ma connaissance les requetes imbriquées ne marchent pas en mysql mais bon on ne sait jamais :)

Reply

Marsh Posté le 01-12-2004 à 22:04:50   

Reply

Marsh Posté le 02-12-2004 à 11:58:08    

ça marche avec la dernière version de sql en tout cas !

Reply

Marsh Posté le 02-12-2004 à 15:50:23    

Ben c'est comme du PHP sauf que ça tourne sur le service IIS de Windows NT et non pas Apache, et que c'est une techno M$ et non pas GNUchaipakoi et que la syntaxe est dérivée du VB et non pas d'un micmac comme le PHP.
 
Ensuite, tout comme le PHP, on peut faire du 100% bien crade comme il faut, ou du 100% presque propre comme on peut :)
 
(comme le PHP, l'ASP n'est pas un langage typé, donc c'est un peu chiant. Cela dit, je trouve qu'en bon nombre de points il est bien plus propre, même si sa permissivité permet de le rendre plus crade que du PHP de goret ;))

Reply

Marsh Posté le 02-12-2004 à 15:57:42    

En gros, en ASP, on peut faire propre :
 

Code :
  1. Option Explicit
  2. Dim sql
  3. Dim cnx
  4. Dim rs
  5. Dim nom
  6. Dim prenom
  7. sql = "select * from toto"
  8. Set cnx = Server.CreateObject("ADODB.Connection" )
  9. cnx.Open cnxString, login, password
  10. Set rs = Server.CreateObject("ADODB.RecordSet" )
  11. Set rs.ActiveConnection = cnx
  12. rs.Open sql
  13. Set nom = rs("nom" )
  14. Set prenom = rs("prenom" )
  15. do while not rs.EOF
  16.   Response.Write "<p>" & nom & " " & prenom & "</p>"
  17.   rs.MoveNext
  18. loop
  19. rs.Close
  20. Set rs = Nothing
  21. cnx.Close
  22. Set cnx = Nothing


 
Tout comme on peut faire crade :
 

Code :
  1. Set cnx = Server.CreateObject("ADODB.Connection" )
  2. cnx.Open cnxString, login, password
  3. Set rs = cnx.Execute "select * from truc"
  4. do while not rs.EOF
  5.   Response.Write "<p>" & rs("nom" ) & " " & Response.Write rs("prenom" ) & "</p>"
  6.   rs.Movenext
  7. loop


 
Les deux marchent de la même façon.
Le premier est débugable et ne laisse pas un gros bordel dans la mémoire de IIS, l'autre va bouffer des ressources pas possible dans IIS (connections et recordsets qui restent en mémoire jusqu'au timeout bdd) et complètement indébugable pour peu que la page soit un peu chargée.
 
En bref, comme le PHP, on peut faire du crade comme du propre. Mais je trouve que mise à part quelques points noirs (chaînes de caractères) l'ASP permet globalement de faire du code plus lisible.


Message édité par Arjuna le 02-12-2004 à 15:59:31
Reply

Sujets relatifs:

Leave a Replay

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