Функция MySQL COUNT не работает так, как хотелось бы в нескольких объединенных запросах - PullRequest
2 голосов
/ 29 августа 2011

Я уже некоторое время изменяю запрос, читая множество постов на этом замечательном сайте, чтобы добраться до того места, где я до сих пор. Но, увы, теперь я застрял: (

Этот запрос и соответствующая часть базы данных, которую я разработал, похожи на систему комментариев на YouTube. Соответствующие таблицы и поля:

USRS
usr_id int (PK)

КОММЕНТАРИИ
comment_id int (PK) usr_id int (FK) ссылается на usrs (usr_id) topic_id int (FK) ссылки на темы (topic_id) Descr Varchar создал varchar

COMMENT_LIKERS
comment_id int (PK) (FK) ссылается на комментарии (comment_id) usr_id int (PK) (FK) ссылается на usrs (usr_id) liker tinyint

Я хочу иметь возможность выбрать все соответствующие данные в одном запросе. Помимо общих данных для каждого комментария, я хочу подсчитать все лайки и антипатии для каждого комментария. На данный момент у меня есть запрос на подсчет лайков для ВСЕХ комментариев, а не для каждого, хотя у меня есть ЛЕВОЕ СОЕДИНЕНИЕ с предложением ON: comments.comment_id = comment_likers.comment_id.

Я изучаю MySql и PHP, поэтому будьте спокойны со мной, если я сделал что-то глупое. Уверяю вас, я искал подсказки к ответу.

Вот запрос:

SELECT comments.comment_id, comments.descr, comments.created, usrs.usr_name,
  COUNT(if(comment_likers.liker = 1, 1, null)),
  COUNT(if(comment_likers.liker = 0, 1, null)),
  comment_likers2.liker
FROM comments
INNER JOIN usrs ON ( comments.usr_id = usrs.usr_id )
LEFT JOIN comment_likers ON ( comments.comment_id = comment_likers.comment_id )
LEFT JOIN comment_likers AS comment_likers2 ON ( comments.comment_id = comment_likers.comment_id AND comment_likers.usr_id = $usrID )
WHERE comments.topic_id = $tpcID
GROUP BY comments.comment_id
ORDER BY comments.created DESC

Заранее спасибо

1 Ответ

2 голосов
/ 29 августа 2011
SELECT comments.comment_id, comments.descr, comments.created, usrs.usr_name, 
  (SELECT COUNT(*) FROM comment_likers WHERE comment_id=comments.comment_id AND liker=1)likes,
  (SELECT COUNT(*) FROM comment_likers WHERE comment_id=comments.comment_id AND liker=0)dislikes
  liker
FROM comments
INNER JOIN usrs ON ( comments.usr_id = usrs.usr_id )
LEFT JOIN comment_likers  ON ( comments.comment_id = comment_likers.comment_id 
 AND comment_likers.usr_id = $usrID )
WHERE comments.topic_id=$tpcID
ORDER BY comments.created DESC;

Пара заметок.Я не был слишком уверен, что должно было выполнить второе левое соединение на comment_likers (то, которое использовало $ usrID).Вас интересуют только лайки по определенной теме от конкретного пользователя?

Кроме того, вы можете подумать об изменении схемы комментариев created на дату-время вместо varchar.

...