У меня есть коррелированный подзапрос ниже. Каждый идентификатор (147, 148, 149) в таблице 1 имеет много записей в таблице 2. У идентификатора 148, однако, нет записей, соответствующих условию времени в выражении. Поэтому он не включен в вывод. Я хочу, чтобы он был включен с 0 для столбца подсчета. Что нужно изменить?
SELECT b.fkid, COUNT(DISTINCT username)
FROM table2 AS b
WHERE
b.fkid IN ( 147,148,149 )
AND time > (SELECT SUBTIME(a.endTime, SEC_TO_TIME( 60*60 )) FROM table1 AS a WHERE a.id = b.fkid)
GROUP BY b.fkid
Это утверждение возвращает:
b.fkid COUNT(DISTINCT username)
147 41
149 26
Я хочу вернуть:
b.fkid COUNT(DISTINCT username)
147 41
148 0
149 26
Хорошо, я получил решение. Это модифицированная версия ответа rexem:
SELECT t.fkid,
IFNULL(nu.num_users, 0)
FROM TABLE_2 t
LEFT JOIN (SELECT t.fkid,
COUNT(DISTINCT t.username) 'num_users'
FROM TABLE_2 t
JOIN TABLE_1 a ON a.id = t.fkid
AND SUBTIME(a.endTime, SEC_TO_TIME( 60*60 )) < t.time
GROUP BY t.fkid) nu ON nu.fkid = t.fkid
WHERE t.fkid IN (147, 148, 149)
GROUP BY t.fkid, nu.num_users
Changes from rexem's answer:
"SEC_TO_TIME( 60*60 )) = t.time" to "SEC_TO_TIME( 60*60 )) < t.time"
Removed "t.time" in GROUP BY clause of subquery