Соединение SQL со счетчиком

#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