Упорядочить результат MySQL по значению из JSON_OBJECT - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть 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}]
  )
)

Мне нужно отсортировать продукты по цене первого варианта каждого продукта.

  • Идентификатор продукта 1 должен быть первым, поскольку цена первого варианта составляет 100
  • Идентификатор продукта 2 должен быть вторым, потому что цена первого варианта 200, а 200> 100

Я пытаюсь:

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

но получите ошибку:

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

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Это пример, когда не следует скрывать столбец (price) внутри столбца (в данном случае в JSON). Вместо этого оставьте price в качестве своего собственного столбца, чтобы сделать его доступным для MySQL для сортировки (при необходимости) или фильтрации.

Можно также сохранить столбец внутри строки JSON, чтобы JSON был "завершен".

Проблема заключалась в том, что у вас были неправильные кавычки вокруг variant. Backtics (который вы использовали) предназначен для имен столбцов и таблиц. Вы нуждались в апострофах или двойных кавычках (' или "), потому что variant - просто строка в этом контексте.)

0 голосов
/ 06 ноября 2018

Я думаю, что вы хотите:

order by min(v.price)

Нет необходимости анализировать объект JSON.

...