2 левых соединения (MSSQL) складываются вместе, умножая результаты. Но этого не должно быть
Я создаю сайт чата, и для представления чатов аудитории у меня есть 3 выпадающих списка-Спорт (по умолчанию все виды спорта), День/месяц/год, пользователи онлайн/общее количество пользователей.
Теперь, если по умолчанию выбраны все виды спорта и я выбираю 1 месяц и общее количество пользователей, ожидаемый результат должен быть
Мой вопрос таков
SELECT DISTINCT roo.[Sports], roo.[Name], COUNT(DISTINCT chu.ChatUserLogId) AS TotalUsers, COUNT(DISTINCT liu.[LoggedInUserID]) AS UserOnline FROM Room AS roo LEFT JOIN LoggedInUser AS liu ON roo.RoomID = liu.RoomID LEFT JOIN ChatUserLog AS chu ON roo.RoomID = chu.RoomID AND chu.LoggedInTime >= DATEADD(DAY,-30,GETDATE()) GROUP BY roo.[Sports], roo.[Name] ORDER BY TotalUsers DESC
Один человек предположил, что с помощью моего метода я на самом деле умножаю строку из-за двух соединений, поэтому мне нужно сначала агрегировать, а затем объединять.
Так что в конце концов я тоже попробовал этот запрос
with agg_ChatUserLog as (select RoomId, count(*) as cnt_user_tot from ChatUserLog WHERE LoggedInTime >= DATEADD(DAY,-30,GETDATE()) group by RoomId), agg_LoggedInUser as (select RoomId, count(*) as cnt_user_logged from LoggedInUser group by RoomId) select Sports, Name, cnt_user_tot, cnt_user_logged from Room r left outer join agg_ChatUserLog acu on acu.RoomId = r.RoomId left outer join agg_LoggedInUser alu on alu.RoomId = r.RoomId;
Но это также умножает результаты.
Где я делаю ошибку в обоих запросах?
Спасибо заранее и иметь хороший день впереди.
Что я уже пробовал:
Я думаю, что проблема также связана с "группировкой по" пунктам... Итак, я пытаюсь изменить и опробовать их тоже в
with agg_ChatUserLog as (select RoomId, count(*) as cnt_user_tot from ChatUserLog WHERE LoggedInTime >= DATEADD(DAY,-30,GETDATE()) group by RoomId), agg_LoggedInUser as (select RoomId, count(*) as cnt_user_logged from LoggedInUser group by RoomId) select Sports, Name, cnt_user_tot, cnt_user_logged from Room r left outer join agg_ChatUserLog acu on acu.RoomId = r.RoomId left outer join agg_LoggedInUser alu on alu.RoomId = r.RoomId GROUP BY cnt_user_tot ORDER BY cnt_user_tot DESC