MYSQL 跨多个字段连接 2 个表
MYSQL joining 2 tables accross multiple fields
应该很简单哦,不过可能是酒醉了。
Table A(需要零件的东西)
id | Name | part1 | part2 | part 3 | part 4 | etc
1 | This thing | 1 | 2 | 3 | 2 | etc
2 | another thing | 1 | 1 | 4 | 5 | etc
3 | even more | 11 | 2 | 2 | 2 | etc
Table B(零件)
id | Description
1 | I am a part
2 | I am another Part
3 | Im a very imprtant part
一个;;我实际上需要做的是 select 每个 "thing" 需要的所有 "parts" "DESCRIPTION"
所以我得到的每一行都是英文的,而不是 ID 号
即
id | Thing name | part 1 | part 2 | part 3 | part 4
1 | This Thing | name of part | name of part | name of part | name of part
就像我说的,这里完全是记忆超载,我失去了活下去的意志。非常感谢收到的任何帮助。提前致谢。
它看起来像这样。自从我写了一个 MySQL 查询以来已经有一段时间了。我相信有人可以改进它。
SELECT
a.id,
a.name,
b1.description,
b2.description,
b3.description,
b4.description
FROM
table_a `a`
LEFT JOIN
table_b `b1`
ON a.part1 = b1.id
LEFT JOIN
table_b `b2`
ON a.part2 = b2.id
LEFT JOIN
table_b `b3`
ON a.part3 = b3.id
LEFT JOIN
table_b `b4`
ON a.part4 = b4.id
您的数据模型从一开始就注定了您的复杂性。
select
*
from TableA A
left join TableB B1 on A.part1 = B1.id
left join TableB B2 on A.part2 = B1.id
left join TableB B3 on A.part3 = B1.id
left join TableB B4 on A.part4 = B1.id
这是未经测试的,但是如果您 "unpivot" TableA 会打开更多的可能性。
例如
SELECT
A.id
, A.Name
, GROUP_CONCAT(B.Description ORDER BY A.rowno) as PartsList
FROM (
SELECT
A1.id
, A1.Name
, cj.rowno
, CASE
WHEN cj.rowno = 1 THEN part1
WHEN cj.rowno = 2 THEN part2
WHEN cj.rowno = 3 THEN part3
WHEN cj.rowno = 4 THEN part4
END AS LinkID
FROM TableA a1
CROSS JOIN ( 1 AS rowno
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
) cj
) A
LEFT JOIN TableB B ON A.LinkId = B.ID
GROUP BY
A.id
, A.Name
并且,如果 TableA 被永久规范化,您将不需要这些复杂性。
应该很简单哦,不过可能是酒醉了。
Table A(需要零件的东西)
id | Name | part1 | part2 | part 3 | part 4 | etc
1 | This thing | 1 | 2 | 3 | 2 | etc
2 | another thing | 1 | 1 | 4 | 5 | etc
3 | even more | 11 | 2 | 2 | 2 | etc
Table B(零件)
id | Description
1 | I am a part
2 | I am another Part
3 | Im a very imprtant part
一个;;我实际上需要做的是 select 每个 "thing" 需要的所有 "parts" "DESCRIPTION"
所以我得到的每一行都是英文的,而不是 ID 号
即
id | Thing name | part 1 | part 2 | part 3 | part 4
1 | This Thing | name of part | name of part | name of part | name of part
就像我说的,这里完全是记忆超载,我失去了活下去的意志。非常感谢收到的任何帮助。提前致谢。
它看起来像这样。自从我写了一个 MySQL 查询以来已经有一段时间了。我相信有人可以改进它。
SELECT
a.id,
a.name,
b1.description,
b2.description,
b3.description,
b4.description
FROM
table_a `a`
LEFT JOIN
table_b `b1`
ON a.part1 = b1.id
LEFT JOIN
table_b `b2`
ON a.part2 = b2.id
LEFT JOIN
table_b `b3`
ON a.part3 = b3.id
LEFT JOIN
table_b `b4`
ON a.part4 = b4.id
您的数据模型从一开始就注定了您的复杂性。
select
*
from TableA A
left join TableB B1 on A.part1 = B1.id
left join TableB B2 on A.part2 = B1.id
left join TableB B3 on A.part3 = B1.id
left join TableB B4 on A.part4 = B1.id
这是未经测试的,但是如果您 "unpivot" TableA 会打开更多的可能性。 例如
SELECT
A.id
, A.Name
, GROUP_CONCAT(B.Description ORDER BY A.rowno) as PartsList
FROM (
SELECT
A1.id
, A1.Name
, cj.rowno
, CASE
WHEN cj.rowno = 1 THEN part1
WHEN cj.rowno = 2 THEN part2
WHEN cj.rowno = 3 THEN part3
WHEN cj.rowno = 4 THEN part4
END AS LinkID
FROM TableA a1
CROSS JOIN ( 1 AS rowno
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
) cj
) A
LEFT JOIN TableB B ON A.LinkId = B.ID
GROUP BY
A.id
, A.Name
并且,如果 TableA 被永久规范化,您将不需要这些复杂性。