Maison > Questions et réponses > le corps du texte
J'ai un problème pour rejoindre trois tables. La première tentative de jointure de deux tables est réussie, mais le résultat est incorrect sur la troisième table...
J'ai trois tables machine_list est mainTable, puis applicable_rpm et applicable_product sont quelques détails de machine_list
Tableau : machine_list
| id | machine_number | machine_brand | --------------------------------------- | 1 | MN-1 | TOYO | | 2 | MN-2 | AMITA |
Tableau : applicable_rpm
| id | mc_recordID | rpm | -------------------------- | 1 | 1 | 20 | | 2 | 2 | 20 | | 3 | 2 | 25 |
Formulaire : produit_applicable
| id | mc_recordID | productline| --------------------------------- | 1 | 1 | mono | | 2 | 2 | mono | | 3 | 2 | poly |
Je veux revenir comme ceci :
| machine_number | rpm | twine | ---------------------------------------- | MN-1 | 20 | mono | | MN-2 | 20, 25 | mono, poly |
J'ai d'abord essayé de joindre les deux tables en utilisant la requête suivante :
SELECT t1.machine_number, GROUP_CONCAT(' ', t2.speed) machine_speed FROM machine_list t1 INNER JOIN applicable_rpm t2 ON t1.id = t2.mc_recordID GROUP BY t1.id;
Le résultat est :
| machine_number | rpm | --------------------------- | MN-1 | 20 | | MN-2 | 20, 25 |
C'est correct, mais lorsque j'essaie le troisième tableau, il duplique ses valeurs.
Voici ma requête :
SELECT t1.machine_id, GROUP_CONCAT(' ', t2.speed) machine_speed, GROUP_CONCAT(' ', t3.twine) production_line FROM machine_list t1 INNER JOIN applicable_rpm t2 ON t1.id = t2.mc_recordID INNER JOIN applicable_product t3 ON t1.id = t3.mc_recordID GROUP BY t1.id;
Le résultat est :
| machine_number | rpm | twine | ---------------------------------------- | MN-1 | 20, 20 | mono, poly | | MN-2 | 20, 25 | mono, poly |
Que dois-je faire ?
P粉1987499292023-09-12 12:19:03
On dirait que votre jointure génère des lignes en double.
Nous pouvons obtenir le résultat souhaité en utilisant une sous-requête.
SELECT t1.machine_number, t2.machine_speed, t3.production_line FROM machine_list t1 LEFT JOIN ( SELECT mc_recordID, GROUP_CONCAT(' ', speed) AS machine_speed FROM applicable_rpm GROUP BY mc_recordID ) t2 ON t1.id = t2.mc_recordID LEFT JOIN ( SELECT mc_recordID, GROUP_CONCAT(' ', twine) AS production_line FROM applicable_product GROUP BY mc_recordID ) t3 ON t1.id = t3.mc_recordID;
Cela renverra le résultat attendu :
Numéro de machine | Vitesse de la machine | Ligne de production |
---|---|---|
MN-1 | 20 | Mono |
MN-2 | 20, 25 | Monocristal, polycristallin |
P粉5452181852023-09-12 00:17:19
Si vous ne regroupez pas, vous verrez qu'il y a deux lignes associées à MN-2. Donc si vous faites un group_concat il affichera les valeurs de la colonne sélectionnée dans les deux lignes.
SELECT * FROM machine_list t1 INNER JOIN applicable_rpm t2 ON t1.id = t2.mc_recordID INNER JOIN applicable_product t3 ON t1.id = t3.mc_recordID;
Vous devrez utiliser des sélections imbriquées ici. Similaire à :
SELECT machine_number, (SELECT GROUP_CONCAT(rpm) FROM applicable_rpm WHERE mc_recordID = t1.ID) as rpm, (SELECT GROUP_CONCAT(productline) FROM applicable_product WHERE mc_recordID = t1.ID) as twin, FROM machine_list t1;
Après réflexion, vous pouvez également essayer d'utiliser DISTINCT pour GROUP_CONCAT
SELECT t1.machine_id, GROUP_CONCAT(DISTINCT t2.speed) machine_speed, GROUP_CONCAT(DISTINCT t3.twine) production_line FROM machine_list t1 INNER JOIN applicable_rpm t2 ON t1.id = t2.mc_recordID INNER JOIN applicable_product t3 ON t1.id = t3.mc_recordID GROUP BY t1.id;