如何将两个表合并为一个表-MySQL
我有一个名为“item”的表,如下所示:如何将两个表合并为一个表-MySQL,mysql,phpmyadmin,Mysql,Phpmyadmin,我有一个名为“item”的表,如下所示: itemId itemName 001 Chicken Chop 002 Mushroom Chicken 003 Grilled Chicken 004 Chicken Maryland id orderItem1 recomItem1 359 001 002 360 001,003 002 361 001 002,003 362 00
itemId itemName
001 Chicken Chop
002 Mushroom Chicken
003 Grilled Chicken
004 Chicken Maryland
id orderItem1 recomItem1
359 001 002
360 001,003 002
361 001 002,003
362 001 003
363 001,002 003
然后,我有一个名为“genreco”的表,如下所示:
itemId itemName
001 Chicken Chop
002 Mushroom Chicken
003 Grilled Chicken
004 Chicken Maryland
id orderItem1 recomItem1
359 001 002
360 001,003 002
361 001 002,003
362 001 003
363 001,002 003
从以上两个表中,我希望我的表“Recom”如下所示:
id orderItem1 recomItem1
359 Chicken Chop Mushroom Chicken
360 Chicken Chop, Grilled Chicken Mushroom Chicken
361 Chicken Chop Mushroom Chicken, Grilled Chicken
362 Chicken Chop Grilled Chicken
363 Chicken Chop, Mushroom Chicken Grilled Chicken
现在,我有两部分代码。代码的第一部分给出了以下表格:
id orderItem1
359 Chicken Chop
360 Chicken Chop, Grilled Chicken
361 Chicken Chop
362 Chicken Chop
363 Chicken Chop, Mushroom Chicken
SELECT g1.id AS id, GROUP_CONCAT(i1.itemName) AS orderItem1
FROM `item` AS i1
CROSS JOIN
(
SELECT 1 AS pos
UNION ALL
SELECT 2 AS pos
UNION ALL
SELECT 3 AS pos
UNION ALL
SELECT 4 AS pos
UNION ALL
SELECT 5 AS pos
) q
JOIN `genRecom` AS g1
ON i1.itemId = CAST(NULLIF(SUBSTRING_INDEX(g1.orderItem1, ',', -pos), SUBSTRING_INDEX(g1.orderItem1, ',', 1 - pos)) AS UNSIGNED)
GROUP BY g1.id;
id recomItem1
359 Mushroom Chicken
360 Mushroom Chicken
361 Mushroom Chicken, Grilled Chicken
362 Grilled Chicken
363 Grilled Chicken
SELECT g1.id AS id, GROUP_CONCAT(i1.itemName) AS recomItem1
FROM `item` AS i1
CROSS JOIN
(
SELECT 1 AS pos
UNION ALL
SELECT 2 AS pos
UNION ALL
SELECT 3 AS pos
UNION ALL
SELECT 4 AS pos
UNION ALL
SELECT 5 AS pos
) q2
JOIN `genRecom` AS g1
ON i1.itemId = CAST(NULLIF(SUBSTRING_INDEX(g1.recomItem1, ',', -pos), SUBSTRING_INDEX(g1.recomItem1, ',', 1 - pos)) AS UNSIGNED)
GROUP BY g1.id;
代码的第二部分给出了以下表格:
id orderItem1
359 Chicken Chop
360 Chicken Chop, Grilled Chicken
361 Chicken Chop
362 Chicken Chop
363 Chicken Chop, Mushroom Chicken
SELECT g1.id AS id, GROUP_CONCAT(i1.itemName) AS orderItem1
FROM `item` AS i1
CROSS JOIN
(
SELECT 1 AS pos
UNION ALL
SELECT 2 AS pos
UNION ALL
SELECT 3 AS pos
UNION ALL
SELECT 4 AS pos
UNION ALL
SELECT 5 AS pos
) q
JOIN `genRecom` AS g1
ON i1.itemId = CAST(NULLIF(SUBSTRING_INDEX(g1.orderItem1, ',', -pos), SUBSTRING_INDEX(g1.orderItem1, ',', 1 - pos)) AS UNSIGNED)
GROUP BY g1.id;
id recomItem1
359 Mushroom Chicken
360 Mushroom Chicken
361 Mushroom Chicken, Grilled Chicken
362 Grilled Chicken
363 Grilled Chicken
SELECT g1.id AS id, GROUP_CONCAT(i1.itemName) AS recomItem1
FROM `item` AS i1
CROSS JOIN
(
SELECT 1 AS pos
UNION ALL
SELECT 2 AS pos
UNION ALL
SELECT 3 AS pos
UNION ALL
SELECT 4 AS pos
UNION ALL
SELECT 5 AS pos
) q2
JOIN `genRecom` AS g1
ON i1.itemId = CAST(NULLIF(SUBSTRING_INDEX(g1.recomItem1, ',', -pos), SUBSTRING_INDEX(g1.recomItem1, ',', 1 - pos)) AS UNSIGNED)
GROUP BY g1.id;
有人知道我应该如何组合这两个代码来生成一个类似于我上面提到的表“Recom”吗?感谢您的帮助。使用GROUP\u CONCAT()
和基本连接:
SELECT t1.id,
GROUP_CONCAT(DISTINCT t2.itemName) AS orderItem1,
GROUP_CONCAT(DISTINCT t3.itemName) AS recomItem1
FROM genRecom t1
INNER JOIN item t2
ON FIND_IN_SET(t2.itemId, t1.orderItem1) > 0
INNER JOIN item t3
ON FIND_IN_SET(t3.itemId, t1.recomItem1) > 0
GROUP BY t1.id
此处演示:
假设每个项目在genreco
表中的给定行中只出现一次,这种方法会很好地工作。如果没有,则可能必须在单独的子查询中为两列中的每一列生成项字符串:
SELECT t1.id, t1.orderItem1, t2.recomItem1
FROM
(
SELECT t1.id, GROUP_CONCAT(t2.itemName) AS orderItem1
FROM genRecom t1
INNER JOIN item t2
ON FIND_IN_SET(t2.itemId, t1.orderItem1) > 0
GROUP BY t1.id
) t1
INNER JOIN
(
SELECT t1.id, GROUP_CONCAT(t2.itemName) AS recomItem1
FROM genRecom t1
INNER JOIN item t2
ON FIND_IN_SET(t2.itemId, t1.recomItem1) > 0
GROUP BY t1.id
) t2
ON t1.id = t2.id
此处演示:
如果表“Item”中的itemId是VARCHAR数据类型,那么如果itemId是INT类型呢?我已经正确回答了您的问题。如果没有,请发布您的实际数据。谢谢您的回答!现在,我将itemId作为INT数据类型存储在表“Item”中,因此如果我像您那样做,我将得到“[]”。所以我提出了解决方案(我的问题上面显示的代码),只是我不知道如何组合这两个代码来获得我想要的输出。哈哈。。也许我可以考虑将itemId的数据类型更改为VARCHAR:)@K.W您有一个数据问题,因为您试图将整数
1
与字符串'001'
匹配,而它们不是同一件事。您可以在任何地方使用001
,也可以在任何地方使用1
。请注意,解决此问题的方法是可行的,但非常难看,您应该真正修复数据。