[MySQL] Requète un peu compliqué...

Requète un peu compliqué... [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 17-07-2004 à 20:01:26    

Voici la structure de mes tables:
 
#
# Structure de la table `alliance_desc`
#
 
CREATE TABLE alliance_desc (
  id int(11) NOT NULL auto_increment,
  nom varchar(30) NOT NULL default '',
[...]
  recrutement char(1) NOT NULL default '1',
  PRIMARY KEY  (id),
  UNIQUE KEY nom (nom)
) TYPE=MyISAM COMMENT='Définition des alliances';
# --------------------------------------------------------
 
#
# Structure de la table `alliance_membres`
#
 
CREATE TABLE alliance_membres (
  id int(11) NOT NULL auto_increment,
  id_alliance int(11) NOT NULL default '0',
  id_village int(11) NOT NULL default '0',
  id_membre int(11) NOT NULL default '0',
[...]
  PRIMARY KEY  (id),
  UNIQUE KEY id_village (id_village)
) TYPE=MyISAM ;
 
 
Un peu d'explication:
La requete ci dessous sert a afficher la liste des alliances avec des informations tirer des deux tables: alliance_desc et alliance_membres.
De alliance_membres j'aimerais tirer le nombre de village appartenant à l'alliance [COUNT(alliance_membres.id)] mais aussi le nombre de membre appartenant à l'alliance étant donné que chaque membre peut avoir X village integrer dans une alliance.
 
Voici ma requete actuellement:
Elle ne gere pas le nombre de membre.
 
SELECT alliance_desc.nom, alliance_desc.id, COUNT(alliance_membres.id) AS nb_village
FROM alliance_desc
LEFT OUTER JOIN alliance_membres ON alliance_membres.id_alliance=alliance_desc.id
GROUP BY alliance_desc.id
ORDER BY '$ordredesc' DESC
LIMIT $limit,20";
 
 
Exemple concret:
Nous sommes dans la table alliance_membres.
Voici quelques enregistrement:
 
id, id_alliance, id_village, id_membre
1      1           2            5
1      1           9            5
1      1           5            5
1      1           1            2
1      1           7            2
 
Si vous m'avez suivi, j'aimerais donc obtenir le nombre de membre de deux en effectuant ma requete.
 
Je me demande si il y'a pas du DISTINCT qui traine ? En tout cas je n'arrive pas à l'integrer pour l'instant.
 
 
Merci d'avance.


Message édité par smilm le 17-07-2004 à 20:01:42
Reply

Marsh Posté le 17-07-2004 à 20:01:26   

Reply

Marsh Posté le 17-07-2004 à 20:23:44    

Telle que tu las conçois, ce n'est pas possible, tu cherches à faire des count sur deux groupements distincts, ce qui est interdit.
La solution la plsu rapide que je vois est de faire des requètes imbriquées (si ta version de MySQL le permet), ou alors changer la structure des tables.

Reply

Marsh Posté le 17-07-2004 à 20:28:55    

Je sais pas pour les requetes imbriqués.
 
Changez la structure de ma table, ca serait donc mettre un compteur_membre, compteur_village dans la table alliance_desc ?

Reply

Marsh Posté le 17-07-2004 à 20:41:08    

par exemple. Mais à la base, tes tables me semble bizarement pensée (ou bien je ne saisie pas la logique qui s'y cache). Par exemple, tu as une table alliance_membre, et visiblement, ce ne sont aps les membres qui sont le centre de cette table mais un id dont je me demande encore à quoi il peut bien se rapporter vu que les villages sont déjà uniques et non nuls.

Reply

Marsh Posté le 17-07-2004 à 20:59:01    

oui mon id est useless ici.
 
Ha....
Donc:
Id_village en Primary Key ca me permetterait d'avoir le nombre de village et le nombre de membres ?

Reply

Marsh Posté le 17-07-2004 à 21:07:11    

non.

Reply

Marsh Posté le 17-07-2004 à 22:26:16    

Gizmo > Dans sa table "membre", il stocke en fait les membres et tous les villages qu'ils ont (je suppose que c'est la base d'un wargame ou autre)
 
En fait, si un village ne peut appartenir qu'à un utilisateur, logiquement c'est village la clé. Dans le cas contraire, c'est le couple village/membre qui devient la clé.
 
SmilM > Pour ce qui est de la requête... T'as essayé de rajouter simplement COUNT(DISTINCT alliance_mabres.id_membre) ?
 
En tout cas, j'ai recréé ta table membre, avec les mêmes données, et ça marche chez moi (SQL Server, mais bon, le count(distinct) est suffisament basic pour espérer qu'il soit supporté par MySQL)
 
select alliance, count(distinct village), count(distinct membre)
from membres
group by alliance
 
Ca mer retourne
 
1    5      2


Message édité par Arjuna le 17-07-2004 à 22:26:36
Reply

Marsh Posté le 17-07-2004 à 23:31:36    

exact, j'avais oublié de count distinct.

Reply

Marsh Posté le 18-07-2004 à 18:19:18    

Merci beaucoup !
Je savais bien qu'il y'avait du distinct qui trainait mais je savais pas trop comment le placer.

Reply

Sujets relatifs:

Leave a Replay

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