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?
Nampaknya penyertaan anda menjana baris pendua.
Kita boleh mencapai output yang diingini dengan menggunakan subquery.
Ini akan mengembalikan output jangkaan anda:
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.
Anda perlu menggunakan pilihan bersarang di sini. Serupa dengan:
Sebagai renungan, anda juga boleh mencuba menggunakan DISTINCT untuk GROUP_CONCAT