`ORDER BY meta_value ASC` в запросе sql неправильно сортирует цены

Я использую WordPress, у меня есть продукты на веб-сайте, а цена продукта — это специальное поле в бэкэнде.

У меня есть страница, где продукты должны быть отсортированы по цене от высокой к низкой и наоборот.

Мой запрос Sql выглядит так:

SELECT * FROM `wp_postmeta` WHERE meta_key = 'product_price' ORDER BY meta_value ASC

Выше запрос не сортирует цены от низкого до высокого.

Но когда я пытаюсь сделать это ниже, это работает отлично:

$args = array(
'post_type' => 'product-items',
'meta_key' => 'product_price',
'orderby' => 'meta_value',
'order' => 'ASC',
'post_status' => 'publish',
'posts_per_page'=> -1
);
$productList = get_posts($args);

В базе данных я вижу, что тип столбца meta_value — longtext. Может быть, это проблема, почему она не сортируется должным образом. Но почему это работает по-другому.

Я хотел бы пойти со вторым вариантом, но мой код требует сделать это с помощью SQL-запроса, в зависимости от некоторых других вещей.

0

Решение

meta_value это строка — такова природа моделей EAV.

В MySQL мне нравится использовать тихое преобразование для этого. То есть просто обработайте значение как числовое и выполните арифметику:

ORDER BY (meta_value + 0) ASC

Преимущество тихого преобразования заключается в том, что оно не генерирует ошибки для нечисловых значений.

1

Другие решения

Да ты прав. Meta_value не является числовым, поэтому не может отсортировать его по умолчанию.
Вы можете написать meta_value * 1, как написано выше.
Или вы можете использовать SQL CAST для этого:

SELECT * FROM `wp_postmeta`
WHERE meta_key = 'product_price'
ORDER BY CAST(meta_value as unsigned) ASC
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector