如何将两个表合并为一个表-MySQL

如何将两个表合并为一个表-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

我有一个名为“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    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
。请注意,解决此问题的方法是可行的,但非常难看,您应该真正修复数据。