[MYSQL] compter champs de tables différentes

Consultez la formation à Google Analytics de WebRankInfo / Ranking Metrics


sietjp
WRInaute passionné
WRInaute passionné
 
Messages: 622
Inscription: Dim Déc 14, 2003 21:05

[MYSQL] compter champs de tables différentes

Message le Mer Juil 21, 2004 6:58

Bonjour,
Je n'arrive pas à trouver une requête mySQL pour faire ceci :
j'ai 2 tables table1 et table2

dans table1 et table2 j'ai les même champs suivant (id, authorid)

J'aimerais récupérer une liste du genre ( authorid, nombre d'apparition d'authorid dans les 2 tables table1 et table2)

et pouvoir classer la table par nombre d'apparition d'authorid dans les 2 tables table1 et table2

Merci à vous...

Oncle Tom
WRInaute passionné
WRInaute passionné
 
Messages: 812
Inscription: Lun Mar 31, 2003 11:16

Message le Mer Juil 21, 2004 7:12

Code: Tout sélectionner
SELECT table1.authorid a1, table2.authorid a2, COUNT(table1.authorid) AS c1, COUNT(table2.authorid) AS c2
FROM table1
LEFT JOIN table2 ON (table2.authorid = table1.authorid)
GROUP BY c1 ASC, c2 ASC;


Voilou pour ce que j'en dis mais c'est pas forcément juste car je ne pense pas qu'il y ait un "lien" direct entre les 2 tables d'où la jointure "gauche".
Si c'est pas ça, tu pourrais expliquer à quoi servent les 2 tables et quelles sont leurs liens ?

yep
WRInaute impliqué
WRInaute impliqué
 
Messages: 286
Inscription: Sam Avr 03, 2004 12:02

Message le Mer Juil 21, 2004 8:11

COUNT ... AS => cela sert à quoi
LEFT JOIN => pareil, quelle est la différence avec INNER JOIN ?

merci d'avance ;)


sietjp
WRInaute passionné
WRInaute passionné
 
Messages: 622
Inscription: Dim Déc 14, 2003 21:05

Message le Mer Juil 21, 2004 8:55

The Jedi a écrit:
Code: Tout sélectionner
SELECT table1.authorid a1, table2.authorid a2, COUNT(table1.authorid) AS c1, COUNT(table2.authorid) AS c2
FROM table1
LEFT JOIN table2 ON (table2.authorid = table1.authorid)
GROUP BY c1 ASC, c2 ASC;


Voilou pour ce que j'en dis mais c'est pas forcément juste car je ne pense pas qu'il y ait un "lien" direct entre les 2 tables d'où la jointure "gauche".
Si c'est pas ça, tu pourrais expliquer à quoi servent les 2 tables et quelles sont leurs liens ?

Merci The Jedi, y a une erreur à l'exécution :
MySQL said:
#1056 - Can't group on 'c1'

Pour info cette requête
SELECT table1.authorid a1, COUNT( table1.authorid ) FROM table1 GROUP BY table1.authorid marche pour une seule table, c'est la même chose qui m'intéresserait mais opur les 2 tables à la fois. J'avais bien peur qu'il faille utilise un JOIN, est ce qu'il y aurait un bon tutorial sur le join autre que la référence mysql qui n'est pas trés explicite...

Oncle Tom
WRInaute passionné
WRInaute passionné
 
Messages: 812
Inscription: Lun Mar 31, 2003 11:16

Message le Mer Juil 21, 2004 10:18

je suis un peu bête là ^^ fais au lieu de grouper sur c1 et c2, groupe sur a1 et a2.

Code: Tout sélectionner
SELECT table1.authorid a1, table2.authorid a2, COUNT(table1.authorid) AS c1, COUNT(table2.authorid) AS c2
FROM table1
LEFT JOIN table2 ON (table2.authorid = table1.authorid)
GROUP BY a1, a2
ORDER BY c1 ASC, c2 ASC;


Le soucis dans l'histoire c'est que tes colonnes a1 et a2 n'ont pas forcément le même nombre de lignes et j'ai peur que s'il y en a plus dans a2, ben ça s'arrêtera à la fin de a1 (chais pas si tu me comprends).



COUNT ... AS

AS sert à (re)définir un nom de champ. Tu peux ne pas le mettre et coller directement le nouveau nom de champ à côté (j'aurais pu écrire "table.authorid AS a1") mais je préfère avec.
Le problème du COUNT() c'est que ça te renvoie un nom de champ à la gomme car ça ne correspond pas à une colonne de ta table. Donc pour réutiliser le résultat après c'est pas gagné.

LEFT JOIN

C'est pareil que le INNER JOIN sauf que, pour le INNER JOIN, ta ligne sera sélectionnée si tu as une correspondance d'une valeur X ET sur la première table, ET sur la deuxième. Si dans la 2° table tu trouves pas le même élément X que dans la première, mysql zappe la ligne.
Avec LEFT (ou RIGHT) JOIN, tu récupère la ligne même si tu trouves pas la correspondance dans la 2° table.

Imagine que t'aies une table avec une liste d'articles et une autre avec une liste de membre. Quand tu affiches un article, tu fais une jointure avec la table des membres pour afficher le pseudo à partir de l'ID contenu dans la première.
Avec l'INNER JOIN, si jamais le membre n'existe plus dans la 2° table, ta requête ne retournera même pas les infos de la table articles.
Avec le LEFT JOIN, ben membre ou pas, t'auras les infos de la table articles et, si elle existent, les infos liées au membre.


sietjp
WRInaute passionné
WRInaute passionné
 
Messages: 622
Inscription: Dim Déc 14, 2003 21:05

Message le Mer Juil 21, 2004 13:55

La ca passe mais ce ne retourne pas ce que je voulais, le résultat n'est pas clair et je n'arrive pas à l'interpréter.
Est ce que le cas où un authorid n'est pas présent dans une des tables sera traité par ta requête?

Oncle Tom
WRInaute passionné
WRInaute passionné
 
Messages: 812
Inscription: Lun Mar 31, 2003 11:16

Message le Mer Juil 21, 2004 15:26

Normalement oui mais uniquement pour la 1° table.
Sinon faudra faire 2 requêtes pour tout tout avoir.

Tu voulais quoi exactement ?


sietjp
WRInaute passionné
WRInaute passionné
 
Messages: 622
Inscription: Dim Déc 14, 2003 21:05

Message le Mer Juil 21, 2004 15:46

Pour formuler autrement, le résultat souhaité c'est le nombre de fois qu'apparait un authorid donné que ce soit dans table1 ou table2.

Je crois que c mission impossible en 1 seule requête non?


lorantino
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 154
Inscription: Ven Juin 04, 2004 15:09

Message le Mer Juil 21, 2004 16:45

soit plus clair, qu est ce que tu veux afficher au final ???

et donne nous aussi la structure de tes tables avec 2 ou 3 exemples d enregistrements pour qu on s amuse comme des fous ;)

++

Oncle Tom
WRInaute passionné
WRInaute passionné
 
Messages: 812
Inscription: Lun Mar 31, 2003 11:16

Message le Jeu Juil 22, 2004 8:05

Ben en 1 requête ça tient du bricolage car les 2 tables sont indépendantes (en tous cas d'après leur structure).
Et pareil que lorantino, je veux tout savoaareuh :p


sietjp
WRInaute passionné
WRInaute passionné
 
Messages: 622
Inscription: Dim Déc 14, 2003 21:05

Message le Jeu Juil 22, 2004 9:59

par exemple

table1 :
id | authorid
1 | 10
2 | 5
3 | 10
4 | 6
5 | 2
6 | 5


table2 :
id | authorid
1 | 11
2 | 1
3 | 10
4 | 6
5 | 5
6 | 1

je veux obtenir
authorid | nb apprition authorid dans table1 et table2
10 | 3
5 | 3
6 | 2
1 | 2
11 | 1

Oncle Tom
WRInaute passionné
WRInaute passionné
 
Messages: 812
Inscription: Lun Mar 31, 2003 11:16

Message le Jeu Juil 22, 2004 10:55

Question *on : pourquoi avoir 2 tables qui ont la même structure ?


sietjp
WRInaute passionné
WRInaute passionné
 
Messages: 622
Inscription: Dim Déc 14, 2003 21:05

Message le Jeu Juil 22, 2004 11:19

En fait j'ai s'imlpifié le problème, les tables ont plus de champs que ça, avec des champs différents. Ceux des tables qui contiennent certaines actions des membres du site. Je voulais avoir le nombre d'action total d'un membre pour estimer son activité sur le site.

Oncle Tom
WRInaute passionné
WRInaute passionné
 
Messages: 812
Inscription: Lun Mar 31, 2003 11:16

Message le Jeu Juil 22, 2004 12:20

Ah ouais okay ...
donc tu as 1 table membre et 1 table d'action ou ... ? Parce que là ça peut être possible mais faut pas être si radin en infos ^^


lorantino
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 154
Inscription: Ven Juin 04, 2004 15:09

Message le Jeu Juil 22, 2004 14:00

j sais pas si c est possible de faire tout ca juste avec du sql ... moi a ta place je ferais un petit fichier php, ca sera bien plus simple.

tu commence par faire un select distinct sur tes authorid des 2 tables, tu met dans un tableau avec php et tu fais un for pour compter le nombre de fois qu il apparaisse ... ensuite tu classe le tableau final ...

bon enfin tout ca reste a tester mais comment dire, j ai pas trop envie de le faire la ;)

++

[MYSQL] compter champs de tables différentes

Formation recommandée sur ce thème :

Formation Google Analytics : en 2 jours, apprenez comment exploiter l'essentiel des possibilités de l'outil de mesure d'audience de Google. Formation animée par Julien Coquet, expert certifié officiellement par Google Analytics.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités