В моем запросе мне нужно получить предыдущую строку с текущей строкой, а затем присоединиться к нескольким таблицам. Я получил предыдущую строку, используя переменные SQL на моем сервере разработки (MySQL 5.7), все работает нормально, но на моем производственном сервере (MariaDB 10) результаты предыдущих строк плохие, просто смешанные, плохая часть - это только предыдущая строка с переменными SQL другие части запроса работают хорошо.
Мой запрос:
customers.title,
calendar.start_time,
calendar.hours_per_time,
calendar.self_certification,
calendar.bulletin_certification,
calendar.extra,
@previous_start AS previous_start,
@previous_start := calendar.start_time,
@previous_end AS previous_end,
@previous_end := calendar.hours_per_time,
DATE_FORMAT(calendar.date, '%d-%m') AS day_month,
TIME_FORMAT(calendar.start_time, '%H:%i') AS hours_min
FROM
(SELECT @previous_start := '00:00', @previous_end := '0.00') AS calendar_prev, calendar
INNER JOIN relationships ON calendar.relation_id = relationships.relation_id
INNER JOIN customers ON customers.customer_id = relationships.customer_id
WHERE relationships.user_id = '$user_id'
AND DATE_FORMAT(calendar.date, '%m-%Y') = '$date'
ORDER BY calendar.date, hours_min ASC
Если у вас MariaDB 10.2, используйте его функции «Windowing» для работы с «предыдущими» и «текущими» строками.






Дело в том, что MySQL не дает никаких гарантий относительно порядка выполнения оператора select. Итак, хотя вы ожидаете, что эти операторы переменных сеанса будут выполняться в определенном порядке, это может быть не так, и вы можете увидеть разное поведение в разных версиях MySQL.