Maison  >  Questions et réponses  >  le corps du texte

Joignez 3 tables référençant la table 1 dans MYSQL et combinez les valeurs avec un séparateur virgule

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粉208469050P粉208469050404 Il y a quelques jours476

répondre à tous(2)je répondrai

  • P粉198749929

    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

    répondre
    0
  • P粉545218185

    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;

    répondre
    0
  • Annulerrépondre