SQL : utilisation de sous requêtes ?

SQL : utilisation de sous requêtes ? - SQL/NoSQL - Programmation

Marsh Posté le 29-05-2002 à 17:15:37    

Tiens... y'a pas de catégorie SQL... ;)
 
J'ai donc un ch'tit souci...
j'ai une table comportant deux champs (Pays01, Pays02).
J'aimerai pouvoir afficher en php le résultat de la requête suivante :
lister l'ensemble des pays présents dans les deux champs, avec leur nombre d'apparition, et liste par ordre décroissant de ce nombre d'apparition.
 
Du style :
 
France    | 12
Allemagne | 5
Belgique  | 3
Suède     | 1
 
Mais voilà, je n'y arrive pas...
 
Vous avez des idées?
 
Merci.

 

[jfdsdjhfuetppo]--Message édité par Thocan le 29-05-2002 à 20:06:53--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 29-05-2002 à 17:15:37   

Reply

Marsh Posté le 29-05-2002 à 17:17:50    

y a une catégorie SGBD...
 
SELECT DISTINCT Pays01,COUNT(*) AS total FROM tatable WHERE Pays01=Pays02 ORDER BY total DESC
 
essayes ça pour voir.
 
 
EDIT : j'avais oublié le tri..

 

[jfdsdjhfuetppo]--Message édité par Sh@rdar le 29-05-2002 à 17:18:35--[/jfdsdjhfuetppo]


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 29-05-2002 à 20:06:40    

Merci je vais voir ça...  :)
 
PS : c bon, je l'ai déplacé vers SGBD... J'avais pas vu

 

[jfdsdjhfuetppo]--Message édité par Thocan le 29-05-2002 à 20:07:21--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 29-05-2002 à 20:11:14    

Nope, je viens de l'essayer sous access , ça ne fonctionne pas...

Reply

Marsh Posté le 29-05-2002 à 20:15:11    

arf...  
 
essayes  
 
SELECT Pays01,COUNT(*) AS total FROM tatable WHERE Pays01=Pays02 ORDER BY total DESC GROUP BY Pays01


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 29-05-2002 à 21:48:10    

Hmm... non plus.
Mais pourquoi fais-tu Pays01 = Pays02...?
 
Ce que je me demandais aussi, c'est puisque j'utilise cette requête en php, n'y-a-t-il pas moyen de faire deux requêtes et de rassembler le résultat de ces deux requêtes au sein d'un même tableau, puis de les réordonner en ordre décroissant...?

Reply

Marsh Posté le 29-05-2002 à 23:00:58    

Thocan a écrit a écrit :

Hmm... non plus.
Mais pourquoi fais-tu Pays01 = Pays02...?
 
Ce que je me demandais aussi, c'est puisque j'utilise cette requête en php, n'y-a-t-il pas moyen de faire deux requêtes et de rassembler le résultat de ces deux requêtes au sein d'un même tableau, puis de les réordonner en ordre décroissant...?  




 
merde...
 
en relisant ton post je vienx de comprendre mon erreur..
 
tu cherche les différentes valeur de Pays1 ou Pays2  
 
moi j'avais compris que tu cherchais le nombre de ligne ou le pays etait dans les 2 champs (ie identique quoi..)
 
c'est pour ça que je pigeais pas pourquoi tu parlais de requête imbriquées... sorry je décroche à cette heure ci...


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 30-05-2002 à 09:15:07    

Lol...
 
Je te remercie quand même...  :)

Reply

Marsh Posté le 30-05-2002 à 10:13:47    

A mon tour  :D  
 
SELECT Pays1, COUNT(*) As Total FROM tatable GROUP BY Pays1 UNION (SELECT Pays2, COUNT(*) As Total FROM tatable GROUP BY Pays2) ORDER BY Total DESC
 
Ca me fait peur, mais bon, ça peut marcher après tout... :ange:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 30-05-2002 à 10:18:52    

Salut,
 
1) tu crees un table temporaire, disons temp, avec une seule colonne, disons col, et qui est du meme type que 1 des deux colonnes de ta table de base
 
2) apres tu t'arranges pour inserer dans cette table temp, les valeurs de la premiere colonne de la table de base qui apparaissent dans la deuxieme colonne avec la requete suivante :  
 
select pays01 from table_de_base where pays01 in (select pays02 from table_de_base);
 
3) tu fais pareil qu'au point 2 sauf que c'est pour l'autre colonne, donc la requete devient :  
 
select pays02 from table_de_base where pays02 in (select pays01 from table_de_base);
 
4) tu fais un simple select ici : select distinct(col),count(*) as total from table_temp group by col order by total desc;
 
5) tu affiches ton resultat
 
6) tu effaces la table temporaire pour faire plus propre :  
drop table temp;
 
voila
 
a+

 

[jfdsdjhfuetppo]--Message édité par Slash- le 30-05-2002 à 10:20:04--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 30-05-2002 à 10:18:52   

Reply

Marsh Posté le 30-05-2002 à 10:26:40    

Slash- a écrit a écrit :

Salut,
 
1) tu crees un table temporaire, disons temp, avec une seule colonne, disons col, et qui est du meme type que 1 des deux colonnes de ta table de base
 
2) apres tu t'arranges pour inserer dans cette table temp, les valeurs de la premiere colonne de la table de base qui apparaissent dans la deuxieme colonne avec la requete suivante :  
 
select pays01 from table_de_base where pays01 in (select pays02 from table_de_base);
 
3) tu fais pareil qu'au point 2 sauf que c'est pour l'autre colonne, donc la requete devient :  
 
select pays02 from table_de_base where pays02 in (select pays01 from table_de_base);
 
4) tu fais un simple select ici : select distinct(col),count(*) as total from table_temp group by col order by total desc;
 
5) tu affiches ton resultat
 
6) tu effaces la table temporaire pour faire plus propre :  
drop table temp;
 
voila
 
a+  
 
 




 
dans la mesure ou les 2 tables ont le même nombre de champs, pourquoi faire une table temporaire ? une UNION est toute indiquée, même si je suis pas sur que la mienne fonctionne correctement  ;)


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 30-05-2002 à 10:58:27    

Harkonnen a écrit a écrit :

A mon tour  :D  
 
SELECT Pays1, COUNT(*) As Total FROM tatable GROUP BY Pays1 UNION (SELECT Pays2, COUNT(*) As Total FROM tatable GROUP BY Pays2) ORDER BY Total DESC
 
Ca me fait peur, mais bon, ça peut marcher après tout... :ange:  




 
Trop bon... Yes ! Ca a l'air de fonctionner...  :bounce:  
J'avais fait le coup de l'union mais je ne pensais pas qu'on puisse si facilement mettre un order by derrière...
Grand merci, donc.
 
PS : sinon, pour slash, oui effectivement la table temp était une solution... mais j'espérais effectivement qu'il y ait une solution plus directe...  :sol:  
Merci

Reply

Marsh Posté le 30-05-2002 à 11:01:21    

Thocan a écrit a écrit :

 
Trop bon... Yes ! Ca a l'air de fonctionner...  :bounce:  
J'avais fait le coup de l'union mais je ne pensais pas qu'on puisse si facilement mettre un order by derrière...
Grand merci, donc.



Putain, du 1er coup et sans test, y'a vraiment des jours ou je m'étonne moi même  :ouch:  
A+  :hello:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 30-05-2002 à 12:23:36    

Bon... histoire de te soulager un peu :
1) j'ai rajouté des () dans la première partie de l'union sinon ça ne fonctionnait pas..
2) ça fonctionne sous Access2000 mais apparemment pas pour la base mysql...
 
Chier. :cry:
 
PS : c'est le "UNION" que mysql n'aime pas?

 

[jfdsdjhfuetppo]--Message édité par Thocan le 30-05-2002 à 12:25:40--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 30-05-2002 à 12:57:56    

Vi, ça doit effectivement être le coup de l'UNION...
Bref, je suis passé par un array() et ça fonctionne bien, donc je vais m'en contenter...
Ca ralonge le code, c tout...
 
Merci

Reply

Marsh Posté le 30-05-2002 à 14:13:54    

Effectivement, il me semble que MySQL ne gère pas les sous requetes.
Il serait peut etre temps qu'il soit mis à jour, entre ça et les clés étrangères, ça commence à faire...


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Sujets relatifs:

Leave a Replay

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