从JSON_OBJECT中按值排序mysql结果

时间:2018-11-06 09:22:42

标签: mysql sql json mariadb sql-order-by

我有MariaDB 10.2和以下SQL:

SELECT products.*,
  CONCAT('[', GROUP_CONCAT(JSON_OBJECT(
  'id', V.id,
  'price', V.price
  ) ORDER BY V.price ASC), ']') AS variants,
FROM products
LEFT JOIN products_variants V ON V.products_id = products.id
GROUP BY products.id
LIMIT 0,10

结果是:

Array (
  [0] => Array (
    [id] => 1,
    [variants] => [{"id": 1, "price": 100},{"id": 2, "price": 110}]
  )
  [1] => Array (
    [id] => 2,
    [variants] => [{"id": 3, "price": 200},{"id": 4, "price": 210}]
  )
)

我需要根据每种产品的第一个版本的价格对产品进行排序。

  • 产品ID 1必须为第一个,因为第一个变量价格为100
  • 产品ID 2必须为第二个,因为第一个变体价格为200和200> 100

我尝试:

ORDER BY JSON_EXTRACT(`variants`, '$[0].price)

但出现错误:

Reference 'variants' not supported (reference to group function)

2 个答案:

答案 0 :(得分:1)

我想你想要

order by min(v.price)

无需解析JSON对象。

答案 1 :(得分:0)

这是一个示例,说明不应在列(在这种情况下为JSON)内隐藏列(price)。相反,请将price保留为自己的列,以使MySQL可以轻松进行排序(根据需要)或过滤。

还可以将列保留在JSON字符串中,以使JSON是“ complete”。

问题是您在variant周围引用了错误的引号。 Backtics(您使用的)用于列和表的名称。您需要用撇号或双引号('"),因为在这种情况下variant只是一个字符串。)