Rumah > Soal Jawab > teks badan
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粉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 |
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;