Heya!, у меня есть следующий запрос:
SELECT t1.pm_id
FROM fb_user_pms AS t1,
fb_user_pm_replies AS t2
WHERE (t1.pm_id = '{$pm_id}'
AND t1.profile_author = '{$username}'
OR t1.pm_author = '{$username}'
AND t1.pm_id = t2.pm_id
AND t2.pm_author = '{$username}'
AND COUNT(t2.reply_id) > 0)
AND t1.deleted = 0
Тем не менее, я получаю ошибку группировки - моя догадка вызвана тем, что AND COUNT (t2.reply_id) > 0?
Как я могу исправить вышеуказанный запрос, чтобы он работал.
Надеюсь, кто-то может помочь.
Ура!
Ошибка заключается в том, что вы не можете использовать агрегированную функцию (COUNT, MIN, MAX, AVG и т.д.) в предложении WHERE, не находясь внутри подзапроса. Только предложение HAVING
позволяет использовать агрегаты, не будучи обернутыми в подзапросы.
Но проверка того, что ответы больше нуля, не требуется в INNER JOIN - это гарантирует, что будет хотя бы один ответ, связанный с записью fb_user_pms
. JOIN также означает, что информация в t1
будет дублироваться для каждой поддерживаемой записи в fb_user_pm_replies
. IE: Если запись fb_user_pms
имеет три связанные с ней записи fb_user_pm_replies
, вы увидите запись fb_user_pms
в результирующем наборе три раза.
Запрос, который вы хотите использовать:
SELECT t1.pm_id
FROM fb_user_pms AS t1
WHERE t1.pm_id = '{$pm_id}'
AND '{$username}' IN (t1.profile_author, t1.pm_author)
AND t1.deleted = 0
AND EXISTS(SELECT NULL
FROM fb_user_pm_replies AS t2
WHERE t2.pm_id = t1.pm_id
AND t2.pm_author = '{$username}')
Предложение EXISTS возвращает true или false, основываясь на критериях WHERE. Он также не будет дублировать результаты t1
.
Агрегатная функция COUNT
не может идти в предложении WHERE. Вы должны использовать GROUP BY и поместить его в предложение HAVING.
SELECT t1.pm_id
FROM fb_user_pms AS t1
JOIN fb_user_pm_replies AS t2 ON t1.pm_id = t2.pm_id
WHERE (
(t1.pm_id = '{$pm_id}' AND t1.profile_author = '{$username}') OR
(t1.pm_author = '{$username}' AND t2.pm_author = '{$username}')
) AND t1.deleted = 0
GROUP BY t1.pm_id
HAVING COUNT(t2.reply_id) > 0
Если t2.reply_id
является столбцом NOT NULL, вам вообще не нужно предложение HAVING.
t2
в выводе, вы должны использовать JOIN.