【问题标题】:Combining Data in Two Tables SQL合并两个表中的数据 SQL
【发布时间】:2018-11-19 00:39:46
【问题描述】:

我确定一个非常基本的问题,但我仍然被卡住:

Table A - image_number, camera_type, total_sales
Table B - image_number, keyword

表 A 中每个 image_number 都有一个 ROW - 示例:

image_number="AXJ789, camera_type="Nikon", total_sales=678
image_number="JIJ123", camera_type="Canon", total_sales=999
image_number="KNI908", camera_type="Sony", total_sales=565

表 B 对每个 image_number 有许多 ROW - 示例:

image_number="AXJ789", keyword = "rain"
image_number="AXJ789", keyword = "mountain"
image_number="AXJ789", keyword = "grass"
image_number="AXJ789", keyword = "cloud"

我想要做的是加入这两个表,以便我可以生成以下输出:

image_number="AXJ789", camera_type=678, camera_type="Nikon", keyword(1) = "rain", keyword(2) = "mountain", keyword(3) = "grass", keyword(4) =“云”

换句话说,我想拥有表 A 中每一行的所有项目 + 表 B 中的所有项目。对于表 A 中的每个 image_number,表 B 中可能没有“关键字”或 50 个关键字 -取决于图像。

当我进行 INNER JOIN 时,我当然可以从表 B 中获得一个“关键字”,但我不知道如何获得所有这些关键字。

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:

    您可以将关键字连接在一起:

    select a.*,
           (select group_concat(b.keyword)
            from b
            where b.image_number = a. image_number
           ) as keywords
    from a;
    

    这将创建一个以逗号分隔的关键字列表。这比尝试将它们放在单独的列中要简单得多(在 MySQL 中)。事实上,如果你想要单独的列,我可能会建议解析这个结果:

    select a.*,  -- or whatever columns you want
           substring_index(keywords, ',' 1) as keyword1,
           substring_index(substring_index(keywords, ',' 2), ',', -1) as keyword2,
           substring_index(substring_index(keywords, ',' 3), ',', -1) as keyword3,
           substring_index(substring_index(keywords, ',' 4), ',', -1) as keyword4
    from a left join 
         (select b.image_number, group_concat(b.keyword) as keywords
          from b
          group by b.image_number
         ) b
         on b.image_number = a. image_number;
    

    【讨论】:

    • 非常感谢。会给它一个旋转。
    【解决方案2】:

    您可以使用GROUP_CONCATJOIN 为每张图片生成一个以逗号分隔的关键字列表(但如果图片可能没有关键字,请使用LEFT JOIN)。

    SELECT a.*, GROUP_CONCAT(b.keyword) AS keyword_list
    FROM a
    JOIN b on b.image_number = a.image_number
    GROUP BY a.image_number
    

    样本数据的输出:

    image_number    camera_type     total_sales     keyword_list
    AXJ789          Nikon           678             rain,mountain,grass,cloud
    

    Demo on dbfiddle

    然后您可以在您的应用程序中将其解析为一个数组,例如在 PHP 中(如果您已将该行读入$row):

    $keywords = explode(',', $row['keyword_list']);
    print_r($keywords);
    

    输出:

    Array
    (
        [0] => rain
        [1] => mountain
        [2] => grass
        [3] => cloud
    )
    

    【讨论】:

    • 是的。康卡特。说得通。昨晚我醒来意识到我可以转储到 excel 然后 concat 然后转储回表 A。这非常清楚。非常感谢。
    • 完美运行!
    • 太好了。很高兴我能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    相关资源
    最近更新 更多