#mysql #sql
#mysql #sql
Вопрос:
У меня есть функция SQL join, готовая к реализации, однако, если я выполню приведенный ниже фрагмент, будут возвращены только строки из wp_tours_tours, которые также содержат строки в wp_tours_tours_bookings.
SELECT
wp_tours_tours.*,
SUM(wp_tours_tours_bookings.qty) AS "TotalBookings"
FROM wp_tours_tours
left join wp_tours_tours_bookings ON wp_tours_tours.tour_id=wp_tours_tours_bookings.tour_id
WHERE wp_tours_tours.post_id=12
Если я использую приведенный ниже скрипт без функции SUM() в инструкции select, он возвращает несколько строк (даже те, у которых нет строк в wp_tours_tours_bookings)
SELECT
wp_tours_tours.*
FROM wp_tours_tours
left join wp_tours_tours_bookings ON wp_tours_tours.tour_id=wp_tours_tours_bookings.tour_id
WHERE wp_tours_tours.post_id=12
Мне нужно, чтобы первый фрагмент работал так, чтобы он просто возвращал 0 для «TotalBookings», если в нем нет строк, и просматривал все данные из tours_tours, даже если в tours_tours_bookings нет строк.
Ответ №1:
Я бы использовал здесь коррелированный подзапрос:
select
t.*,
(
select coalesce(sum(tb.qty), 0)
from wp_tours_tours_bookings tb
where tb.tour_id = t.tour_id
) as totalbookings
from wp_tours_tours t
where t.post_id=12
Ответ №2:
Ваш запрос неверно сформирован, потому что у вас есть функция агрегирования ( SUM()
) и столбцы, которые не агрегируются — но нет GROUP BY
.
Вам нужен GROUP BY
:
SELECT tt.*, COALESCE(SUM(ttb.qty), 0) AS TotalBookings
FROM wp_tours_tours tt LEFT JOIN
wp_tours_tours_bookings ttb
ON tt.tour_id = ttb.tour_id
WHERE tt.post_id = 12
GROUP BY tt.tour_id; -- or whatever the primary key is
Вы также можете использовать коррелированный подзапрос (который, вероятно, имеет лучшую производительность):
SELECT tt.*,
(SELECT COALESCE(SUM(ttb.qty), 0)
FROM wp_tours_tours_bookings ttb
WHERE tt.tour_id = ttb.tour_id
) AS TotalBookings
FROM wp_tours_tours tt
WHERE tt.post_id = 12