Sertai 3 jadual merujuk jadual 1 dalam MYSQL dan gabungkan nilai dengan pemisah koma
P粉208469050
P粉208469050 2023-09-11 19:18:28
0
2
525

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

membalas semua(2)
P粉198749929

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

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;
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan