2016-07-22 3 views
1

У меня есть 2 стола здесь.Получить контент из 2 таблиц

Posts      Comments 
post_id      comment_id 
content      post_id        
          create_datetime 
          content 

Мне нужно написать SQL-запрос, который возвращает каждое сообщение (отсортированное по алфавиту по контенту) и его последний комментарий.

Он возвращает только 1 строку (у меня несколько сообщений), а комментарий, возвращаемый в строке, не является последним.

Я написал этот SQL-запрос: -

SELECT posts.content AS post, 
     Max(Unix_timestamp(comments.create_datetime)), 
     comments.content AS comment 
FROM posts, 
     comments 
WHERE posts.post_id = comments.post_id 

Однако это не делает то, что required..what я делаю неправильно?

+0

'это не делать то, что required.' разве полезно. Покажите нам пример данных, текущий и желаемый результат. Пожалуйста, прочитайте [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t И вот отличное место для [** START **] (http : //spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/), чтобы узнать, как улучшить качество вопроса и получить лучшие ответы. –

+0

Поощряйте использование эксклюзионного 'JOIN' sintaxis, Аарон Бертран написал хорошую статью [Плохие привычки пинать: использование JOIN-стиля старого стиля] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/ bad-habitits-to-kick-using-old-style-joins.aspx) об этом. –

+0

@JuanCarlosOropeza Я обновил свой вопрос. – RobertPuerco

ответ

0
SELECT posts.content AS post, 
    t.create_datetime , 
    t.content AS comment 
FROM posts 
Inner Join ( 
    select comments.content , comments.post_id , comments.create_datetime 
    from comments 
    where (comments.create_datetime, comments.comment_id) in 
    (select max(comments.create_datetime), max(comments.comment_id) 
        from comments 
        group by comments.post_id)) t on t.post_id = posts.post_id; 
+0

'# 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'comments.post_id)) t на t.post_id = posts.post_id L' в строке 10 ' – RobertPuerco

+0

Я проверил свой ответ и обновил .. убедитесь, что вы не скопировали woen .. потому что в моем answwr нет L char, который я вижу, и конец вашего комментария – scaisEdge

+0

Все еще не работает. '# 1064 - У вас возникла ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'comments.post_id)) t на t.post_id = posts.post_id LIMI' в строке 10 ' – RobertPuerco

0

Вам нужно сначала получить максимальную дату, а затем получить комментарий.

SELECT post_id, MAX(create_datetime) as max_date 
FROM Comments 
GROUP BY post_id 

выборки

SELECT C.post_id, C.content 
FROM Comments C 
JOIN (SELECT post_id, MAX(create_datetime) as max_date 
     FROM Comments 
     GROUP BY post_id 
    ) T 
    ON C.create_datetime = T.max_date 

ПРИМЕЧАНИЕ: Вы должны быть осторожны, если отношения возможны

+0

Ошибка: - '# 1054 - Неизвестный столбец 'T.create_datetime' in 'on clause' ' – RobertPuerco

+0

fixed был' ON C.create_datetime = T.max_date' –

-1

Попытка использовать отношения за счет уменьшения избыточности. В вашей структуре базы данных ваша таблица Comments в настоящее время содержит достаточно данных, чтобы полностью игнорировать таблицу Posts. Это также создаст аномалии.

Так что подумайте о том, как posts_id и content находятся в обеих таблицах. Вы хотите, чтобы общее поле связывало таблицы, но вы не хотите размещать содержимое всей таблицы в другой таблице, чтобы сделать ее относительной.

Database Redundancy and Normal Forms

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