Заставить этот запрос работать?

0

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

3 ответа

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.

  • 0
    Хорошо, отлично, что если я хотел бы также выбрать столбец из t2. - Как бы я интегрировать это? например, SELECT t1.pm_id, t2.body FROM ...
  • 0
    @Newbtophp: Чтобы получить столбцы t2 в выводе, вы должны использовать JOIN.
Показать ещё 2 комментария
1

Агрегатная функция 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.

0
  • Условие с COUNT должно находиться в части HAVING. Он не может быть частью части WHERE.
  • Элемент SELECT должен также использовать агрегированные функции, например MAX (t1.pm_id)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню