Joignez 3 tables référençant la table 1 dans MYSQL et combinez les valeurs avec un séparateur virgule
P粉208469050
P粉208469050 2023-09-11 19:18:28
0
2
541

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粉208469050
P粉208469050

répondre à tous(2)
P粉198749929

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粉545218185

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;
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal