【问题标题】:Query's results manipulation in SQL or PHP?查询在 SQL 或 PHP 中的结果操作?
【发布时间】:2018-08-01 11:06:56
【问题描述】:

我写了这个查询:

SELECT p.category, r.id, r.code, u.hash_name, r.created_at, r.updated_at FROM uploads AS u
JOIN refrigerators AS r ON u.id=r.image
JOIN products_refrigerators AS pr ON pr.refrigerator_id=r.id
JOIN products p ON pr.product_id = p.id

结果如下:

Array
(
    [0] => stdClass Object
        (
            [category] => lamps
            [id] => 1
            [code] => canopy
            [path] => public/uploads/AAmAnnC2Yoij9QblcybTJefE5vTQrNZsfDCWqOPt.jpeg
            [created_at] => 2018-02-21 11:15:06
            [updated_at] => 2018-02-21 11:15:06
        )

    [1] => stdClass Object
        (
            [category] => panels
            [id] => 1
            [code] => canopy
            [path] => public/uploads/AAmAnnC2Yoij9QblcybTJefE5vTQrNZsfDCWqOPt.jpeg
            [created_at] => 2018-02-21 11:15:06
            [updated_at] => 2018-02-21 11:15:06
        )

    [2] => stdClass Object
        (
            [category] => lamps
            [id] => 2
            [code] => canopy2
            [path] => public/uploads/nqDT4gEXbF0opPmEpa1cPo5iPSulRoesYcgHiOA3.jpeg
            [created_at] => 2018-02-21 11:17:44
            [updated_at] => 2018-02-21 11:17:44
        )

    [3] => stdClass Object
        (
            [category] => lamps
            [id] => 3
            [code] => QWE
            [path] => public/uploads/0TSrz6j3JJH17XgEs2161mOh8aYgDikujdYwrCWR.jpeg
            [created_at] => 2018-02-21 11:18:13
            [updated_at] => 2018-02-21 11:18:13
        )

    [4] => stdClass Object
        (
            [category] => panels
            [id] => 3
            [code] => QWE
            [path] => public/uploads/0TSrz6j3JJH17XgEs2161mOh8aYgDikujdYwrCWR.jpeg
            [created_at] => 2018-02-21 11:18:13
            [updated_at] => 2018-02-21 11:18:13
        )

)

我的问题是:有没有办法获得这样的结果(= 将 category 属性转换为一个数组,该数组将所有相关类别分组,如果存在多个类别)

Array
(
    [0] => stdClass Object
        (
            [category] => Array 
                          (
                              [0] => lamps
                              [1] => panels
                          )
            [id] => 1
            [code] => canopy
            [path] => public/uploads/AAmAnnC2Yoij9QblcybTJefE5vTQrNZsfDCWqOPt.jpeg
            [created_at] => 2018-02-21 11:15:06
            [updated_at] => 2018-02-21 11:15:06
        )

    [1] => stdClass Object
        (
            [category] => Array 
                          (
                              [0] => lamps
                          )
            [id] => 2
            [code] => canopy2
            [path] => public/uploads/nqDT4gEXbF0opPmEpa1cPo5iPSulRoesYcgHiOA3.jpeg
            [created_at] => 2018-02-21 11:17:44
            [updated_at] => 2018-02-21 11:17:44
        )

    [2] => stdClass Object
        (
            [category] => Array 
                          (
                              [0] => lamps
                              [1] => panels
                          )
            [id] => 3
            [code] => QWE
            [path] => public/uploads/0TSrz6j3JJH17XgEs2161mOh8aYgDikujdYwrCWR.jpeg
            [created_at] => 2018-02-21 11:18:13
            [updated_at] => 2018-02-21 11:18:13
        )

)

直接使用 MySQL 还是唯一的方法是操纵结果(在我的例子中是 PHP)?

可能答案是“您必须使用 PHP”,但我不是 MySQL 专家,这就是问题的原因。

【问题讨论】:

  • 你可以用GROUP BY p.id 来做GROUP_CONCAT()
  • @PatrickQ 太棒了,GROUP_CONCAT(p.category)GROUP BY r.id 正是我想要的。它不会创建数组,但我想这绝对是我在 PHP 中的职责。谢谢帕特里克!
  • 是的,如果你想要一个实际的 PHP 数组,你需要在结果上运行 explode()

标签: php mysql sql


【解决方案1】:

您应该连接您的 category 列,然后按 id 对其进行分组,就像帕特里克在 cmets 中提到的那样。

SELECT GROUP_CONCAT(p.category), r.id ... GROUP BY r.id

您也可以使用JSON_ARRAYJSON_OBJECT 函数来实现类似的结果,但不要忘记将它们分组

【讨论】:

  • JSON_ARRAY 在这种情况下实际上会很棒,但不幸的是服务器运行的是 MySQL 5.6 而不是 5.7。感谢您指出此功能!
  • 是的,我忘了提到mysql版本。顺便说一句,如果您以后要使用这些功能,请注意 GROUP_CONCAT 的字符串长度有限,所以当您的列中没有全部数据时,您可能会遇到这种情况,我遇到了这个问题,看看,它可能会节省您的时间未来stackoverflow.com/questions/48956278/…
猜你喜欢
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 2010-12-02
相关资源
最近更新 更多