Задать вопрос

Почему меняется последовательность вывода продуктов sql?

Проблема в том, что при каждом запросе к базе данных, меняется последовательность вывода продуктов, при этом есть сортировка: ORDER BY p.sort_order ASC, LCASE(p.name) ASC
Вот полный запрос:
SELECT p.product_id, MIN(p2s.price) AS min_price FROM product p LEFT JOIN product_to_supplier p2s ON p2s.product_id=p.product_id WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.price>0 AND p2s.quantity>0  AND p.manufacturer_id = '5011' GROUP BY p.product_id ORDER BY p.sort_order ASC, LCASE(p.name) ASC LIMIT 0,15
;

Если я удаляю из запроса условие p.manufacturer_id = '5011' или AND p2s.price>0 , тогда сортировка(последовательность) в таблице остается неизменной, как мне и нужно.

Вот что происходит с данными, если я несколько раз выполню sql:
Первый раз выполняю и выводится так:
15299a44da.png
Выполняю повторно запрос и получаю так:
GrqxMjXi4DBgpA.png

То есть, каждый раз, когда я выполняю запрос, меняется последовательность вывода продуктов.

Вопрос: Как это пофиксить и почему это случается? Слишком много условий?
  • Вопрос задан
  • 202 просмотра
Подписаться 2 Простой Комментировать
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Нет, просто ни `p`.`sort_order`, ни `p`.`name` не входят в выборку. А в старых версиях MySQL при группировке любые поля, не входящие в условие группировки либо в агрегатные функции берутся из любой строки, попавшей в группу. В новых версиях такой запрос вообще выдаст ошибку.
SELECT `p`.`product_id`, `p2s`.`price`
  FROM `product` AS `p`
  JOIN (
    SELECT `product_id`, MIN(`price`) AS `min_price`
      FROM `product_to_supplier`
      WHERE `price` > 0 AND `quantity` > 0
      GROUP BY `product_id`
  ) AS `p2s` ON `p2s`.`product_id` = `p`.`product_id`
  WHERE `p`.`status` = '1' AND `p`.`date_available` <= NOW() 
    AND `p`.`manufacturer_id` = '5011' 
  ORDER BY `p`.`sort_order` ASC, LCASE(`p`.`name`) ASC
  LIMIT 0,15
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы