MySQL COUNT () всего сообщений по определенным критериям? - PullRequest
4 голосов
/ 31 декабря 2010

Я теряю голову, пытаясь понять, что я делаю неправильно, позвольте мне объяснить abit о моей структуре MySQL (чтобы вы лучше поняли), прежде чем я перейду прямо к вопросу.

У меня есть простой форум PHP, и у меня есть столбец в обеих таблицах (для сообщений и тем) с именем «удален», если он равен 0, что означает, что он отображается (считается не удаленным / существует) или если он равен 1, то он скрыт (считается удаленным)/ не существует) - bool / lean.

Теперь о «определенных критериях», о которых я говорю ... Я хочу получить общее количество сообщений в определенном форуме, используя его идентификатор (forum_id), гарантируя, что он учитывает только те сообщения, которые не были удалены (удалено = 0), и их родительские темы также не удалены (удалено = 0).

Имена столбцов / таблиц не требуют пояснений (см. мои усилия ниже)для них - при необходимости).

Я пробовал следующее (используя «простой» JOIN):

SELECT COUNT(t1.post_id) 
  FROM forum_posts AS t1, forum_topics AS t2 
 WHERE t1.forum_id = '{$forum_id}' 
   AND t1.deleted = 0 
   AND t1.topic_id = t2.topic_id 
   AND t2.deleted = 0 
 LIMIT 1

Я такжепробовал это (используя подзапрос):

SELECT COUNT(t1.post_id) 
  FROM forum_posts AS t1 
 WHERE t1.forum_id = '{$forum_id}' 
   AND t1.deleted = 0 
   AND (SELECT deleted 
          FROM forum_topics 
         WHERE topic_id = t1.topic_id) = 0 
 LIMIT 1

Но оба dНе соответствует определенным критериям.

Цените всю помощь!:)

Ответы [ 2 ]

1 голос
/ 31 декабря 2010
SELECT
   COUNT(*) AS total
FROM
   forum_topics
JOIN
   forum_posts ON topic_id
WHERE
   forum_topics.deleted = 0
   AND forum_posts.deleted = 0
   AND forum_posts.forum_id = '{$forum_id}'

Это объединит две таблицы с использованием topic_id и вернет только результаты, которые соответствуют критериям обеих таблиц с удаленным = 0 и желаемым идентификатором форума.

0 голосов
/ 31 декабря 2010

Я не уверен, что понимаю ваш вопрос, но вы можете начать со следующего запроса и настроить его, чтобы делать то, что вы хотите:

SELECT COUNT(*) 
FROM topic_posts AS TP
WHERE forum_id='{$forum_id}' AND
  deleted=0 AND                -- Count topic posts that are not deleted and...
  NOT EXISTS (                 -- make sure they are not for a deleted forum
    SELECT * FROM forum_posts 
    WHERE forum_id=TP.forum_id and 
    deleted<>0)

Я добавил комментарии к запросу, чтобы помочь вам.

...