[PHP] Requête assez complexe, need help

Requête assez complexe, need help [PHP] - PHP - Programmation

Marsh Posté le 16-12-2002 à 17:04:18    

Bon voila mon pb, ça fait pas mal de temps que j'ai pas prog en php/mysql et me rappel plus trop si c'est faisable.
 
Voila, j'ai 3 tables, news, tests et preview.
Dans chaque table je veux compter le nombre de news, test ou preview posté par le user "machin", il est identifié par un num unique. Bref au lieu de faire trois requêtes du genre:
 

Code :
  1. "select count(id) as nbnews from news where idauteur='$numuser'"


 
Je voudrais faire une seule requête, je crois que c'est gérable avec un join mais me rappel plus trop comment, ça fait une bonne heure que je cherche et je trouve pas :/

Reply

Marsh Posté le 16-12-2002 à 17:04:18   

Reply

Marsh Posté le 16-12-2002 à 18:05:55    

C'est peut-être faisable en une seule requête, mais dans ton cas, çà n'as aucun intérêt !
 
Ce que tu veux, c'est des informations sur chaque table qui ne sont pas liées.
 
Une requête, c'est une question que tu pose à la base de données. Dans ton cas, tu as bien 3 questions, vue que c'est sur 3 tables. Même si c'est la même question et que çà concerne le même critère, c'est quand même 3 questions différentes dans la mesure ou le résultat pour une table n'a strictement aucune incidence sur le résultat pour les autres.
 
C'est pas la peine de faire compliqué quand c'est pas nécessaire !


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 16-12-2002 à 18:27:27    

C'est clair que ça n'a strictement aucun interet.
 
De plus, 3 requètes "select count" seront plus rapide qu'une requète bien tordue avec des JOIN.
 

Reply

Marsh Posté le 16-12-2002 à 18:41:46    

Joyrock a écrit :

Bon voila mon pb, ça fait pas mal de temps que j'ai pas prog en php/mysql et me rappel plus trop si c'est faisable.
 
Voila, j'ai 3 tables, news, tests et preview.
Dans chaque table je veux compter le nombre de news, test ou preview posté par le user "machin", il est identifié par un num unique. Bref au lieu de faire trois requêtes du genre:
 

Code :
  1. "select count(id) as nbnews from news where idauteur='$numuser'"


 
Je voudrais faire une seule requête, je crois que c'est gérable avec un join mais me rappel plus trop comment, ça fait une bonne heure que je cherche et je trouve pas :/


J'ai rien dit faudrait faire des LEFT JOIN avec une requete IS NOT NULL, trop lourd effectivement


Message édité par joce le 16-12-2002 à 18:44:30
Reply

Marsh Posté le 16-12-2002 à 20:02:18    

Merci pour vos réponses :)

Reply

Marsh Posté le 17-12-2002 à 11:49:34    

Autre question:
 

Code :
  1. $arr=mysql_db_query($db,"select distinct nom, grade,x,y,niveau from dbh_ennemis where carte='$cartenom' and guilde like '%CdB%' and datemaj>='$date' order by nom,datemaj desc" );


 
Là il est pas sensé me faire un distinct sur le nom ????
 
Parceque si j'ai deux nom pareil pour guilde='CdB' et un guilde='FSCdB' ba il me sort qd même les deux, alors que moi je veux le plus récent :/  
 
Bref moi pas comprendre :D

Reply

Marsh Posté le 17-12-2002 à 12:15:00    

Ben un distinct veut dire qu'il va te ramener un seul exemplaire de chaque valeur corespondant à la colone où ce fait le idstinct.
C'est donc normal qu'il te ramène chaque valeur. ;)

Reply

Marsh Posté le 17-12-2002 à 12:15:57    

vire le DISTINCT et fait un GROUP BY nom

Reply

Marsh Posté le 17-12-2002 à 12:18:58    

joce a écrit :

vire le DISTINCT et fait un GROUP BY nom

il faut aussi qu'il fasse des sum ou autres opérations du genre sur les autres colones s'il veut éviter les problèmes. ;)

Reply

Marsh Posté le 17-12-2002 à 12:51:31    

omega2 a écrit :

il faut aussi qu'il fasse des sum ou autres opérations du genre sur les autres colones s'il veut éviter les problèmes. ;)

non pas la peine :??:

Reply

Marsh Posté le 17-12-2002 à 12:51:31   

Reply

Marsh Posté le 17-12-2002 à 13:48:15    

Le group by nom ça marche mais il me sort pas celui qui est le plus recent, je capte pas pkoi....
 
(Merci Joce)

Reply

Marsh Posté le 17-12-2002 à 13:51:29    

Hmmm avec HAVING ça devrait marcher ?


Message édité par Joyrock le 17-12-2002 à 13:52:06
Reply

Marsh Posté le 17-12-2002 à 14:20:30    

Grumpf je trouve pas, la forumle à mettre dans le having pour qu'il me sorte le nom le plus recent.

Reply

Marsh Posté le 17-12-2002 à 15:12:21    

pas evident je vais tester un truc

Reply

Marsh Posté le 17-12-2002 à 15:25:58    

joce a écrit :

non pas la peine :??:

Si tu fais un groups by nom sans avoir dit dans la requête comment les colones grade,x,y et niveau doivent être gérer, je vois mal comment la bdd va savoir quel résultat retourner sur ces colones là. J'ai vu des bdd qui te retournaient encore plus de ligne de résultat quand tu fesais un group by dans une requête mal renseigné que la même requête sans le group by.
 
joyrock > je sais pas si j'a iparfaitement bien compris ce que tu voulais, mais pour avoir le plus récent, c'est peut être un limit 1,1 qu'il manque à la fin de ta requête. (avec mysql ca marche, pas avec tout les autres bdd vu que c'est pas du sql standard)

Reply

Marsh Posté le 17-12-2002 à 15:33:40    

omega2 a écrit :

Si tu fais un groups by nom sans avoir dit dans la requête comment les colones grade,x,y et niveau doivent être gérer, je vois mal comment la bdd va savoir quel résultat retourner sur ces colones là. J'ai vu des bdd qui te retournaient encore plus de ligne de résultat quand tu fesais un group by dans une requête mal renseigné que la même requête sans le group by.
 
joyrock > je sais pas si j'a iparfaitement bien compris ce que tu voulais, mais pour avoir le plus récent, c'est peut être un limit 1,1 qu'il manque à la fin de ta requête. (avec mysql ca marche, pas avec tout les autres bdd vu que c'est pas du sql standard)


elle retourne un resultat au pif en fait apparement :D

Reply

Marsh Posté le 17-12-2002 à 15:40:51    

omega2 a écrit :

Si tu fais un groups by nom sans avoir dit dans la requête comment les colones grade,x,y et niveau doivent être gérer, je vois mal comment la bdd va savoir quel résultat retourner sur ces colones là. J'ai vu des bdd qui te retournaient encore plus de ligne de résultat quand tu fesais un group by dans une requête mal renseigné que la même requête sans le group by.
 
joyrock > je sais pas si j'a iparfaitement bien compris ce que tu voulais, mais pour avoir le plus récent, c'est peut être un limit 1,1 qu'il manque à la fin de ta requête. (avec mysql ca marche, pas avec tout les autres bdd vu que c'est pas du sql standard)


non en fait son probleme, c'est que le group by se fait *AVANT* l'order by, donc quand il fait sont ORDER BY nom, datemaj, la colonne nom a deja ete reduite a une seule entree (mysql a pris la premiere qu'il trouvait), donc il est nicke :)

Reply

Marsh Posté le 17-12-2002 à 15:51:11    

joce a écrit :


non en fait son probleme, c'est que le group by se fait *AVANT* l'order by, donc quand il fait sont ORDER BY nom, datemaj, la colonne nom a deja ete reduite a une seule entree (mysql a pris la premiere qu'il trouvait), donc il est nicke :)

et un :

Code :
  1. $arr=mysql_db_query($db,"select
  2. nom, max(datemaj) grade,x,y,niveau
  3. from dbh_ennemis
  4. where carte='$cartenom' and guilde like '%CdB%' and datemaj>='$date'
  5. groupe by nom
  6. order by nom,datemaj desc" );

ca serait pas mieux?

Reply

Marsh Posté le 17-12-2002 à 15:57:07    

omega2 a écrit :

et un :

Code :
  1. $arr=mysql_db_query($db,"select
  2. nom, max(datemaj) grade,x,y,niveau
  3. from dbh_ennemis
  4. where carte='$cartenom' and guilde like '%CdB%' and datemaj>='$date'
  5. groupe by nom
  6. order by nom,datemaj desc" );

ca serait pas mieux?


j'y ai pense, mais est ce que ca va prendre les colonnes x, y et niveau associe au max ?

Reply

Marsh Posté le 17-12-2002 à 16:00:38    

je confirme, il ne prend pas les colonnes associees correspondant au max :
 

mysql> CREATE TABLE pouet (a int(10), b int(10), c int(10));
Query OK, 0 rows affected (0.02 sec)
 
mysql> INSERT INTO pouet (a,b,c) VALUES (1,1,1),(1,2,2),(1,4,4),(2,1,1),(2,2,2),(2,4,4);
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0
 
mysql> SELECT a,MAX(b),c FROM pouet GROUP BY a;          
+------+--------+------+
| a    | MAX(b) | c    |
+------+--------+------+
|    1 |      4 |    1 |
|    2 |      4 |    1 |
+------+--------+------+
2 rows in set (0.00 sec)

Reply

Marsh Posté le 17-12-2002 à 16:14:23    

joce a écrit :

je confirme, il ne prend pas les colonnes associees correspondant au max :
 

mysql> CREATE TABLE pouet (a int(10), b int(10), c int(10));
Query OK, 0 rows affected (0.02 sec)
 
mysql> INSERT INTO pouet (a,b,c) VALUES (1,1,1),(1,2,2),(1,4,4),(2,1,1),(2,2,2),(2,4,4);
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0
 
mysql> SELECT a,MAX(b),c FROM pouet GROUP BY a;          
+------+--------+------+
| a    | MAX(b) | c    |
+------+--------+------+
|    1 |      4 |    1 |
|    2 |      4 |    1 |
+------+--------+------+
2 rows in set (0.00 sec)



Domage, falais bien tenter quoi. :(

Reply

Marsh Posté le 17-12-2002 à 16:21:33    

Avec MySQL-4.1 c'est facile :
 

mysql> SELECT a as first,b,c FROM pouet WHERE b=(SELECT MAX(b) FROM pouet WHERE a=first);
+-------+------+------+
| first | b    | c    |
+-------+------+------+
|     1 |    4 |    4 |
|     2 |    4 |    4 |
+-------+------+------+
2 rows in set (0.00 sec)

Reply

Marsh Posté le 17-12-2002 à 16:30:51    

Autrement ba tu fais :
 

Code :
  1. $result = mysql_query ("SELECT a,MAX(b) FROM pouet GROUP BY a ORDER BY b",$link);
  2. while(list($a,$b)=mysql_fetch_row($result))
  3. {
  4.   $result = mysql_query("SELECT a,b,c FROM pouet WHERE a=$a AND b=$b",$link);
  5.   list($res_a,$res_b,$res_c)=mysql_fetch_row($result);
  6.   echo "$res_a, $res_b, $res_c<br />";
  7. }


Message édité par joce le 17-12-2002 à 16:31:59
Reply

Marsh Posté le 18-12-2002 à 01:47:26    

Joyrock a écrit :

Autre question:
 

Code :
  1. $arr=mysql_db_query($db,"select distinct nom, grade,x,y,niveau from dbh_ennemis where carte='$cartenom' and guilde like '%CdB%' and datemaj>='$date' order by nom,datemaj desc" );


 
Là il est pas sensé me faire un distinct sur le nom ????
 
Parceque si j'ai deux nom pareil pour guilde='CdB' et un guilde='FSCdB' ba il me sort qd même les deux, alors que moi je veux le plus récent :/  
 
Bref moi pas comprendre :D


 

select
   nom, grade, x, y, niveau
from
   dbh_ennemis
where
   carte='$cartenom'
   and guilde like '%CdB%'
   and datemaj>='$date'
   and datemaj=max( datemaj )
group by nom, grade, x, y, niveau
order by
   nom


 
Ca devrait aller comme çà non ?


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 18-12-2002 à 11:56:05    

Mara's dad a écrit :


 

select
   nom, grade, x, y, niveau
from
   dbh_ennemis
where
   carte='$cartenom'
   and guilde like '%CdB%'
   and datemaj>='$date'
   and datemaj=max( datemaj )
group by nom, grade, x, y, niveau
order by
   nom


 
Ca devrait aller comme çà non ?


 

mysql> SELECT a,b,c FROM pouet WHERE b=max(b) GROUP BY a,c;  
ERROR 1111: Invalid use of group function


 
:D

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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