Forum Programmation.SQL D'ou que je me trompe ?

Posté par  .
Étiquettes : aucune
0
2
oct.
2006
Salut la communauté,

Pitit problème de requête SQL... Voici le describe de ma table (MySQL 4.1.16 sous FC4):


mysql> describe cli_suivi_dossier;
+-----------------+-------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+-------------+------+-----+---------------------+----------------+
| csd_id | int(11) | | PRI | NULL | auto_increment |
| do_id | int(11) | | MUL | 0 | |
| fsi_id | smallint(6) | YES | MUL | NULL | |
| op_id | smallint(6) | | MUL | 0 | |
| ut_code | varchar(6) | | MUL | | |
| pr_id | char(3) | | MUL | | |
| csd_date | datetime | | | 0000-00-00 00:00:00 | |
| csd_rappel | datetime | YES | | NULL | |
| csd_priorite | tinyint(1) | | | 0 | |
| me_id | int(11) | YES | MUL | NULL | |
| rsd_id | char(3) | | MUL | CRE | |
| csd_comment | text | YES | | NULL | |
| csd_flag_moteur | tinyint(1) | | | 0 | |
+-----------------+-------------+------+-----+---------------------+----------------+


Il y plusieurs csd_id pour un do_id donné. Je veux à chaque fois récupérer le plus grand csd_id avec un 'MAX(csd_id)' et un 'GROUP BY do_id'. Tant que je n'utilise pas la clause WHERE je récupère bien le plus grand mais dès que j'y rajoute quelque chose je récupère que la 1ere ligne de mon groupement.

Voilà la requête que j'aimerais faire fonctionner:

SELECT D.csd_id, D.csd_date, D.do_id,D.ut_code,D.op_id, D.rsd_id, U.ss_id, C.do_domicile, csd_flag_moteur FROM cli_suivi_dossier AS D, cli_dossier AS C, usr_sessions AS U WHERE ((D.ut_code='153') OR (rsd_id='CRE')) AND U.ut_code='153' AND csd_flag_moteur=0 AND C.do_id=D.do_id AND U.op_id=D.op_id GROUP BY do_id ORDER BY csd_date;


Pour simplifier mon problème, dans la 1ere requête qui sui le MAX fonctionne et pas dans la deuxième :

Marche:
SELECT MAX(D.csd_id), D.csd_date, D.do_id,D.ut_code,D.op_id, D.rsd_id FROM cli_suivi_dossier AS D GROUP BY do_id

Marche pas:
SELECT MAX(D.csd_id), D.csd_date, D.do_id,D.ut_code,D.op_id, D.rsd_id FROM cli_suivi_dossier AS D WHERE ((D.ut_code='153') OR (rsd_id='CRE')) GROUP BY do_id


Quelqu'un peut il éclairer ma lanterne ?
  • # Particularité de MySQL

    Posté par  . Évalué à 3.

    C'est une particularité de MySQL de pouvoir ramener des colonnes qui ne font pas parties de la clause Group BY et c'est pour cela que ta deuxième requête ne semble pas fonctionner. En fait, si la première fonctionne c'est pur hasard.

    Le résultat est indéterminé (indéterminable).

    C'est un problème connu.
  • # Having

    Posté par  (site web personnel) . Évalué à 1.

    Et avec ça :

    SELECT MAX(D.csd_id), D.csd_date, D.do_id,D.ut_code,D.op_id, D.rsd_id FROM cli_suivi_dossier AS D HAVING ((D.ut_code='153') OR (rsd_id='CRE')) GROUP BY do_id

    ça marche ?

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.