Я использую 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-запроса, в зависимости от некоторых других вещей.
meta_value
это строка — такова природа моделей EAV.
В MySQL мне нравится использовать тихое преобразование для этого. То есть просто обработайте значение как числовое и выполните арифметику:
ORDER BY (meta_value + 0) ASC
Преимущество тихого преобразования заключается в том, что оно не генерирует ошибки для нечисловых значений.
Да ты прав. Meta_value не является числовым, поэтому не может отсортировать его по умолчанию.
Вы можете написать meta_value * 1, как написано выше.
Или вы можете использовать SQL CAST для этого:
SELECT * FROM `wp_postmeta`
WHERE meta_key = 'product_price'
ORDER BY CAST(meta_value as unsigned) ASC