2010-09-19 6 views
0

Хэя !, У меня есть ниже запрос:Получение этого запроса для работы?

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 

Однако я получаю ошибку группировки - моя догадка его вызвано и COUNT (t2.reply_id)> 0?

Как исправить вышеуказанный запрос, чтобы он работал.

Надеюсь, кто-то может помочь.

Cheers!

ответ

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}') 

СУЩЕСТВУЕТ условие возвращает истину или ложь, основываясь на критериях WHERE. Он также не будет дублировать результаты t1.

+0

Хорошо, что, если я хотел бы также выбрать столбец из t2. - Как бы я интегрировал это? например SELECT t1.pm_id, t2.body FROM ... – Newbtophp

+0

@Newbtophp: Чтобы получить столбцы 't2' в выводе, вы должны использовать JOIN. –

+0

Хм да, но бит, который меня смущает, я хочу получить t2 только в том случае, если он существует, и я не уверен, как это сделать? – Newbtophp

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

агрегатной функции COUNT не может идти в ИНЕКЕ. Вы должны использовать 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 вообще.

Смежные вопросы