[MYSQL] compter champs de tables différentes

WRInaute occasionnel
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...
 
WRInaute impliqué
Code:
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 ?
 
WRInaute occasionnel
COUNT ... AS => cela sert à quoi
LEFT JOIN => pareil, quelle est la différence avec INNER JOIN ?

merci d'avance ;)
 
WRInaute occasionnel
The Jedi a dit:
Code:
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...
 
WRInaute impliqué
je suis un peu bête là ^^ fais au lieu de grouper sur c1 et c2, groupe sur a1 et a2.

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



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é.

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.
 
WRInaute occasionnel
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?
 
WRInaute impliqué
Normalement oui mais uniquement pour la 1° table.
Sinon faudra faire 2 requêtes pour tout tout avoir.

Tu voulais quoi exactement ?
 
WRInaute occasionnel
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?
 
WRInaute discret
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 ;)

++
 
WRInaute impliqué
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
 
WRInaute occasionnel
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
 
WRInaute occasionnel
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.
 
WRInaute impliqué
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 ^^
 
WRInaute discret
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 ;)

++
 
WRInaute discret
Hello,

en une seule requête, je ne suis pas sure que ce soit faisable, en attendant confirmation voici pour le faire sur une seul table (après tu aditionnes !)

Code:
select authorid, count(id) from table group by authorid

... si ça peut aider
 
Discussions similaires
Haut