Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1500 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] Requête assez complexe, need help

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PHP] Requête assez complexe, need help

n°270744
Joyrock
Posté le 16-12-2002 à 17:04:18  profilanswer
 

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 :/

mood
Publicité
Posté le 16-12-2002 à 17:04:18  profilanswer
 

n°270825
Mara's dad
Yes I can !
Posté le 16-12-2002 à 18:05:55  profilanswer
 

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é.
n°270873
cyp en for​sse
Toggenburg enthusiast
Posté le 16-12-2002 à 18:27:27  profilanswer
 

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.
 

n°270891
joce
Architecte / Développeur principal
"BugHunter"
Posté le 16-12-2002 à 18:41:46  profilanswer
 

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
n°270945
Joyrock
Posté le 16-12-2002 à 20:02:18  profilanswer
 

Merci pour vos réponses :)

n°271207
Joyrock
Posté le 17-12-2002 à 11:49:34  profilanswer
 

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

n°271219
omega2
Posté le 17-12-2002 à 12:15:00  profilanswer
 

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. ;)

n°271220
joce
Architecte / Développeur principal
"BugHunter"
Posté le 17-12-2002 à 12:15:57  profilanswer
 

vire le DISTINCT et fait un GROUP BY nom

n°271222
omega2
Posté le 17-12-2002 à 12:18:58  profilanswer
 

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. ;)

n°271240
joce
Architecte / Développeur principal
"BugHunter"
Posté le 17-12-2002 à 12:51:31  profilanswer
 

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 :??:

mood
Publicité
Posté le 17-12-2002 à 12:51:31  profilanswer
 

n°271273
Joyrock
Posté le 17-12-2002 à 13:48:15  profilanswer
 

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

n°271276
Joyrock
Posté le 17-12-2002 à 13:51:29  profilanswer
 

Hmmm avec HAVING ça devrait marcher ?


Message édité par Joyrock le 17-12-2002 à 13:52:06
n°271407
Joyrock
Posté le 17-12-2002 à 14:20:30  profilanswer
 

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

n°271484
joce
Architecte / Développeur principal
"BugHunter"
Posté le 17-12-2002 à 15:12:21  profilanswer
 

pas evident je vais tester un truc

n°271494
omega2
Posté le 17-12-2002 à 15:25:58  profilanswer
 

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)

n°271510
joce
Architecte / Développeur principal
"BugHunter"
Posté le 17-12-2002 à 15:33:40  profilanswer
 

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

n°271513
joce
Architecte / Développeur principal
"BugHunter"
Posté le 17-12-2002 à 15:40:51  profilanswer
 

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 :)

n°271520
omega2
Posté le 17-12-2002 à 15:51:11  profilanswer
 

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?

n°271530
joce
Architecte / Développeur principal
"BugHunter"
Posté le 17-12-2002 à 15:57:07  profilanswer
 

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 ?

n°271539
joce
Architecte / Développeur principal
"BugHunter"
Posté le 17-12-2002 à 16:00:38  profilanswer
 

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)

n°271563
omega2
Posté le 17-12-2002 à 16:14:23  profilanswer
 

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. :(

n°271572
joce
Architecte / Développeur principal
"BugHunter"
Posté le 17-12-2002 à 16:21:33  profilanswer
 

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)

n°271586
joce
Architecte / Développeur principal
"BugHunter"
Posté le 17-12-2002 à 16:30:51  profilanswer
 

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
n°271898
Mara's dad
Yes I can !
Posté le 18-12-2002 à 01:47:26  profilanswer
 

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é.
n°272033
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 18-12-2002 à 11:56:05  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] Requête assez complexe, need help

 

Sujets relatifs
[PHP] ds un formulaire forcer la casse[php] requete avec lisbox additionnée [trouvé]
PHP Envoyer un fichier...[PHP] recuperation ratée variables ds formulaires ???
[PHP/MySQL] Besoin d'un coup de pouce pour optimiser un petit scriptOuoverture de page par script PHP
Problème sur un devoir en assembleur [Help : c'est pas simple <:'o( ][PHP MYSQL] Trier une table dans la base
Requete sensible à la casse[MySQL]optimisation requete
Plus de sujets relatifs à : [PHP] Requête assez complexe, need help


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR