Rumah  >  Soal Jawab  >  teks badan

Sertai 3 jadual merujuk jadual 1 dalam MYSQL dan gabungkan nilai dengan pemisah koma

Saya menghadapi masalah untuk menyertai tiga meja. Percubaan pertama untuk menyertai dua jadual berjaya, tetapi keputusannya tidak betul pada jadual ketiga...

Saya mempunyai tiga jadual machine_list ialah mainTable, kemudian applicable_rpm dan applicable_product ialah beberapa butiran machine_list

Jadual: senarai_mesin

| id | machine_number | machine_brand |
---------------------------------------
| 1  |     MN-1       |     TOYO      |
| 2  |     MN-2       |    AMITA      |

Jadual: applicable_rpm

| id | mc_recordID | rpm |
--------------------------
| 1  |      1      | 20  |
| 2  |      2      | 20  |
| 3  |      2      | 25  |

Borang: produk_terpakai

| id | mc_recordID | productline|
---------------------------------
| 1  |      1      |    mono    |
| 2  |      2      |    mono    |
| 3  |      2      |    poly    |

Saya mahu kembali seperti ini:

| machine_number |   rpm  |   twine    |
----------------------------------------
|      MN-1      | 20     | mono       |
|      MN-2      | 20, 25 | mono, poly |

Saya mula-mula cuba untuk menyertai dua jadual menggunakan pertanyaan berikut:

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;

Hasilnya ialah:

| machine_number |  rpm   |
---------------------------
|      MN-1      |  20    |
|      MN-2      | 20, 25 |

Ini betul, tetapi apabila saya mencuba jadual ketiga, ia menduplikasi nilainya.

Ini adalah pertanyaan saya:

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;

Hasilnya ialah:

| machine_number |  rpm   |   twine    |
----------------------------------------
|      MN-1      | 20, 20 | mono, poly |
|      MN-2      | 20, 25 | mono, poly |

Apa yang perlu saya lakukan?

P粉208469050P粉208469050404 hari yang lalu477

membalas semua(2)saya akan balas

  • P粉198749929

    P粉1987499292023-09-12 12:19:03

    Nampaknya penyertaan anda menjana baris pendua.

    Kita boleh mencapai output yang diingini dengan menggunakan subquery.

    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;

    Ini akan mengembalikan output jangkaan anda:

    Nombor mesin Kelajuan mesin Barisan pengeluaran
    MN-1 20 Mono
    MN-2 20, 25 Kristal tunggal, polihablur

    balas
    0
  • P粉545218185

    P粉5452181852023-09-12 00:17:19

    Jika anda tidak mengumpulkan, anda akan melihat bahawa terdapat dua baris yang dikaitkan dengan MN-2. Jadi jika anda melakukan group_concat ia akan memaparkan nilai lajur yang dipilih dalam kedua-dua baris.

    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;

    Anda perlu menggunakan pilihan bersarang di sini. Serupa dengan:

    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;

    Sebagai renungan, anda juga boleh mencuba menggunakan DISTINCT untuk 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;

    balas
    0
  • Batalbalas