MySQL SELECT с помощью условия

CREATE TABLE `comments` (
  `comment_id` int(11) NOT NULL AUTO_INCREMENT,
  `comment_parent_id` int(11) NOT NULL DEFAULT '0',
  `user_id` int(11) NOT NULL DEFAULT '0',
  `comment_text` varchar(200) NOT NULL DEFAULT '',
  `comment_created` int(20) NOT NULL DEFAULT '0',
  `comment_updated` int(20) NOT NULL DEFAULT '0',
  `comment_replies_count` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`comment_id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1

На каждый комментарий может быть несколько ответов, однако на ответы нельзя отвечать. Таким образом, когда кто-то отвечает на комментарий, строка, которую он вставляет, будет иметь идентификатор комментария, на который он ответил, в столбце родительского идентификатора.

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

SELECT c1.* 
FROM comments c1 
WHERE comment_parent_id = '0' 
ORDER BY comment_created DESC;

So if c1.comment_replies_count > 0 I would like to... 

SELECT c2.* 
FROM comments c2 
WHERE comment_parent_id = c1.comment_id 
ORDER BY comment_created DESC Limit 1;

Можно ли это сделать за 1 запрос? Или лучше сделать еще один вызов базы данных во время оператора цикла php, чтобы получить последний ответ на комментарий?

Заранее спасибо и прошу прощения за мое невежество, так как я все еще учусь.


person Seth    schedule 10.06.2009    source источник


Ответы (2)


Вы можете снова соединить таблицу с самой собой:

SELECT c1.*, c2.*, MAX(c2.comment_id)
FROM comments c1 LEFT JOIN comments c2 ON c1.comment_id = c2.comment_parent_id
WHERE c1.comment_parent_id = '0' 
GROUP BY c1.comment_id
ORDER BY c1.comment_created DESC
person acrosman    schedule 10.06.2009
comment
Это вроде как работает, но не извлекает последний ответ — всегда первый. например: комментарий (ID 1, родительский ID 0, текст Hello) первый ответ (ID 2, родительский ID 1, текст Ответ на комментарий 1) второй ответ (ID 3, родительский ID 1, текст Другой ответ на комментарий 1) Несмотря на то, что MAX возвращает 3, он возвращает идентификатор и текст из первого ответа. - person Seth; 10.06.2009
comment
Попробуйте добавить предложение в предложение WHERE, чтобы сравнить MAX() с c2.comment_id. - person acrosman; 11.06.2009

Попробуйте подвыбрать:

SELECT * FROM comments WHERE comment_parent_id in (
SELECT c1.comment_id 
FROM comments c1 
WHERE c1.comment_parent_id = '0' 
AND c1.comment_replies_count > 0
ORDER BY comment_created DESC)
ORDER BY comment_created DESC Limit 1;
person Cameron    schedule 10.06.2009