Это должно сделать это:
SELECT r.id, r.titel, MAX(s.id) as status
FROM reklamation r
LEFT JOIN reklamation_status s ON s.id_reklamation = r.id
WHERE r.aktiv = 1
GROUP BY r.id, r.titel
Ключевым моментом здесь является использование агрегация для управления количеством элементов от reklamation
до reklamation_status
.В исходном коде встроенный подзапрос использует ORDER BY reklamation_status.id DESC LIMIT 1
, чтобы вернуть наибольшее значение id
в reklamation_status
, соответствующее текущему reklamation
.Без агрегации мы, вероятно, получили бы несколько записей в наборе результатов для каждого reklamation
(по одной для каждого соответствующего reklamation_status
).
Еще один момент, который необходимо учитывать, - это тип JOIN
.INNER JOIN
отфильтровывает записи reklamation
с, которые не имеют reklamation_status
: исходный запрос со встроенным подзапросом не ведет себя так, поэтому я выбрал LEFT JOIN
.Если вы можете гарантировать, что у каждого reklamation
есть хотя бы один дочерний элемент в reklamation_status
, вы можете безопасно переключиться обратно на INNER JOIN
(что может работать более эффективно).
PS:
Я читал, что подзапросы работают медленнее, чем JOIN
с.
Это не универсальная истина.Это зависит от многих факторов и не может быть рассмотрено, не видя вашего точного варианта использования.