【问题标题】:SQL return multiple of same record when using INNER JOIN使用 INNER JOIN 时 SQL 返回多个相同记录
【发布时间】:2018-10-11 13:39:58
【问题描述】:

我正在尝试运行以下 SQL 查询:

"SELECT Main.id, Main.created_min, Main.local_photo_name, Main.description, Main.creator, Main.title, Main.museum, technique.technique 
            FROM Main 
            INNER JOIN technique ON technique.kleding_id=Main.id 
            LIMIT 5"

我希望此查询将技术表中的数据添加到我从主表中获得的结果中。这可行,但是当我有多种技术与主表中的相同 id 相关联时,我希望将这些技术添加到主记录的数组中。

这可以通过 SQL 实现吗?
到目前为止,这是什么:

[16] => Array
    (
        [id] => 47
        [created_min] => 1890
        [local_photo_name] => 
        [description] => Volgens kerkelijk gebruik werden baby's gedoopt in witte gewaden, als teken van onschuld en zuiverheid. Deze doopkleding kon men doorgaans meerdere malen gebruiken en overdragen op volgende generaties. In de 19de eeuw was het doopfeest een belangrijke gebeurtenis. Vele doopgewaden zijn dan ook gemaakt van kostbare materialen en rijkelijk gedecoreerd.
        [creator] => Anoniem
        [title] => Ecrukleurige doopmantel met cape in satijn en kant.
        [museum] => Modemuseum Hasselt
        [technique] => kant
    )

[17] => Array
    (
        [id] => 47
        [created_min] => 1890
        [local_photo_name] => 
        [description] => Volgens kerkelijk gebruik werden baby's gedoopt in witte gewaden, als teken van onschuld en zuiverheid. Deze doopkleding kon men doorgaans meerdere malen gebruiken en overdragen op volgende generaties. In de 19de eeuw was het doopfeest een belangrijke gebeurtenis. Vele doopgewaden zijn dan ook gemaakt van kostbare materialen en rijkelijk gedecoreerd.
        [creator] => Anoniem
        [title] => Ecrukleurige doopmantel met cape in satijn en kant.
        [museum] => Modemuseum Hasselt
        [technique] => satijn
    )

我想要一些东西:

[16] => Array
    (
        [id] => 47
        [created_min] => 1890
        [local_photo_name] => 
        [description] => Volgens kerkelijk gebruik werden baby's gedoopt in witte gewaden, als teken van onschuld en zuiverheid. Deze doopkleding kon men doorgaans meerdere malen gebruiken en overdragen op volgende generaties. In de 19de eeuw was het doopfeest een belangrijke gebeurtenis. Vele doopgewaden zijn dan ook gemaakt van kostbare materialen en rijkelijk gedecoreerd.
        [creator] => Anoniem
        [title] => Ecrukleurige doopmantel met cape in satijn en kant.
        [museum] => Modemuseum Hasselt
        [technique] => Array
            (
            [technique] => kant
            [technique] => satijn
            )
    )

表格如下所示:
请注意,每个表都包含大约 200k 条记录。所以速度是关键。

【问题讨论】:

  • 您能否提供一些来自Maintechnique 表的示例数据以及您的预期结果?
  • 当然会添加一些示例数据,但所需的结果已经在问题中了。

标签: mysql sql arrays inner-join


【解决方案1】:

使用 group by 和 id 并尝试它可能有效

【讨论】:

    【解决方案2】:

    你可以这样做:

    SELECT Main.id,
           Main.created_min,
           Main.local_photo_name,
           Main.description,
           Main.creator,
           Main.title,
           Main.museum,
           JSON_ARRAYAGG(technique.technique) AS techniques
    FROM Main
    INNER JOIN technique ON technique.kleding_id = Main.id
    GROUP BY Main.id
    LIMIT 5
    

    这将返回一个 JSON 技术数组。这里是 JSON_ARRAYAGG 的文档

    【讨论】:

    • 当我尝试这个时,我得到这个错误:警告:mysqli_num_rows() 期望参数 1 是 mysqli_result,布尔值在
    • 删除JSON_ARRAYAGG(technique.technique) AS techniques是否有效
    • 你可以尝试用technique.technique 替换它,而不用JSON_ARRYAGG 只是为了测试
    • 是的,尝试过仍然会出现同样的错误。我正在使用 mysql 顺便说一句
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2014-01-22
    相关资源
    最近更新 更多