Cette question a probablement été posée plusieurs fois, par conséquent, s'il vous plaît, excusez-moi pour les doublons, mais je ne pouvais pas trouver quelque chose comme ça et je ne pouvais pas construire quelque chose de similaire vouloir réaliser.MySQL JOIN avec SUM
Par exemple, permet de dire, j'ai la structure de tableau suivant:
//tasks
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int(11) | NO | P | None | AI |
| user | int(11) | NO | | None | |
| data | varchar(200) | NO | | None | |
+-------+--------------+------+-----+---------+-------+
//votes
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int(11) | NO | P | | AI |
| user | int(11) | NO | | | |
| item | int(11) | NO | | | |
| up | tinyint(1) | NO | | 0 | |
| down | tinyint(1) | NO | | 0 | |
+-------+--------------+------+-----+---------+-------+
Avec les données suivantes:
//tasks
+----+------+------------+
| id | user | data |
+----+------+------------+
| 1 | 1 | something |
| 2 | 2 | lorem ip |
| 3 | 1 | biggy |
+----+------+------------+
//votes
+----+------+------+----+------+
| id | user | item | up | down |
+----+------+------+----+------+
| 1 | 8 | 1 | 1 | 0 |
| 2 | 4 | 1 | 1 | 0 |
| 3 | 2 | 1 | 0 | 1 |
| 4 | 2 | 2 | 1 | 0 |
| 5 | 1 | 2 | 1 | 0 |
+----+------+------+----+------+
Je veux faire quelque chose de similaire à:
SELECT r.* FROM `tasks` WHERE `user` = '1' r
LEFT JOIN (SELECT SUM(t.up) AS up,
SUM(t.down) AS down
FROM `votes` t
WHERE t.item = r.id) r ON r.id = t.item
Et oui, c'est ma requête jusqu'à présent, mais cela ne fonctionne pas, et je ne sais pas comment corriger cela.
Basiquement, je veux:
- Sélectionnez tout de la table tâches où
user
est "x" - Rejoindre chaque ligne de tâches (sélectionnées à l'étape 1) avec somme de
up
, somme dedown
à partir du tableau votes oùitem
est égal àid
de tâches
Et cela devrait produire quelque chose comme (par exemple. user
= 1):
+----+------+------------+----+------+
| id | user | data | up | down |
+----+------+------------+----+------+
| 1 | 1 | something | 3 | 1 |
| 3 | 1 | biggy | 0 | 0 |
+----+------+------------+----+------+
Eh bien, je vous espère les gars à comprendre et peut me aider.
Merci d'avance!
En effet, il ne fonctionne pas, voici l'erreur: '# 1054 - Unknown column 'r.id' dans « où clause'', ressemble à la ligne 'WHERE t. item = r.id'. Et pour autant que je sache, c'est le problème avec 'r' placé après le JOIN ... corrigez-moi si je me trompe, essayant juste d'apprendre de tout cela aussi. – jolt
@Tom: Votre estimation est correcte. Essayez ma deuxième version. – jwueller
Eh bien, puisque vous avez eu la première réponse parfaitement opérationnelle, je vous accorde le crédit, merci pour vos efforts! Et je dois dire, mon esprit est beaucoup plus clair sur ces JOINs maintenant. – jolt