英文:
Joining 3 tables referencing table 1 and combining values with comma delimiter in MYSQL
问题
我在连接三个表时遇到问题。连接两个表的第一次尝试成功了,但在第三个表上结果不正确...
我有三个表 machine_list 是 mainTable,然后 applicable_rpm 和 applicable_product 是 machine_list 的一些细节
表:machine_list
| id | machine_number | machine_brand |
---------------------------------------
| 1 | MN-1 | TOYO |
| 2 | MN-2 | AMITA |
表:applicable_rpm
| id | mc_recordID | rpm |
--------------------------
| 1 | 1 | 20 |
| 2 | 2 | 20 |
| 3 | 2 | 25 |
表:applicable_product
| id | mc_recordID | productline|
---------------------------------
| 1 | 1 | mono |
| 2 | 2 | mono |
| 3 | 2 | poly |
我想要返回这样的结果:
| machine_number | rpm | twine |
----------------------------------------
| MN-1 | 20 | mono |
| MN-2 | 20, 25 | mono, poly |
我首先尝试使用以下查询连接两个表:
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;
结果是正确的:
| machine_number | rpm |
---------------------------
| MN-1 | 20 |
| MN-2 | 20, 25 |
这是正确的,但当我尝试第三个表时,它复制了它的值。
这是我的查询:
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;
结果是:
| machine_number | rpm | twine |
----------------------------------------
| MN-1 | 20, 20 | mono, poly |
| MN-2 | 20, 25 | mono, poly |
我该怎么办?
英文:
I'm having trouble on joining three tables.
First attempt on joining two tables is success, but on third table the results are not correct...
I have three tables machine_list is mainTable then applicable_rpm and applicable_product are some details of machine_list
Table: machine_list
| id | machine_number | machine_brand |
---------------------------------------
| 1 | MN-1 | TOYO |
| 2 | MN-2 | AMITA |
Table: applicable_rpm
| id | mc_recordID | rpm |
--------------------------
| 1 | 1 | 20 |
| 2 | 2 | 20 |
| 3 | 2 | 25 |
Table: applicable_product
| id | mc_recordID | productline|
---------------------------------
| 1 | 1 | mono |
| 2 | 2 | mono |
| 3 | 2 | poly |
I want to return like this:
| machine_number | rpm | twine |
----------------------------------------
| MN-1 | 20 | mono |
| MN-2 | 20, 25 | mono, poly |
I first try joining the two table with this query:
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;
and the result are:
| machine_number | rpm |
---------------------------
| MN-1 | 20 |
| MN-2 | 20, 25 |
which is correct, but when i try on third table it duplicates it's value.
this my query:
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;
and the result are:
| machine_number | rpm | twine |
----------------------------------------
| MN-1 | 20, 20 | mono, poly |
| MN-2 | 20, 25 | mono, poly |
What should i do?
答案1
得分: 2
如果你不进行分组,你会看到与MN-2相关联的两行。因此,如果你使用group_concat,它会显示来自两行的所选列的值。
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;
在这里你需要使用嵌套查询。类似以下方式:
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;
事后你也可以尝试使用带有DISTINCT的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;
英文:
If you don't group, you'll see there are two rows associated with MN-2. So if you group_concat it'll display the value for the selected column from both rows.
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;
You're going to need to use nested selects here. Something like the following:
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;
As an after thought you could also try GROUP_CONCAT with DISTINCT
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;
答案2
得分: 1
好的,以下是翻译好的内容:
看起来你的连接产生了重复行。
我们可以通过使用子查询来实现所需的输出。
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;
这将返回你所期望的输出:
| 机器编号 | 机器速度 | 生产线 |
|------------|------------|--------------|
| MN-1 | 20 | 单体线 |
| MN-2 | 20, 25 | 单体线, 多体线 |
英文:
Looks like your join is producing duplicate rows.
We can achieve the desired output by making use of subqueries.
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;
This will return you the expected output :
machine_number | machine_speed | production_line |
---|---|---|
MN-1 | 20 | mono |
MN-2 | 20, 25 | mono, poly |
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论