LINUX.ORG.RU

[SQL] DISTINCT

 


0

1

Имеется таблица comments в которой есть поля id post_id autor text 1 1 123 123 2 1 312 312 3 2 123 312 4 2 312 123

И post по id которой берутся заголовки новостей содержащей комментарий. Так же есть запрос выполняющий вывод всех последних комментариев с выводом по дате последнего комментария автора , заголовока новости, ссылку на нее

SELECT comments.post_id, comments.autor, post.id, post.title, post.alt_name FROM cms_comments as comments, cms_post as post WHERE post.id=comments.post_id ORDER BY comments.date

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



Последнее исправление: icq876974 (всего исправлений: 1)

select comments.post_id,
comments.autor,
( select *
  from 
  ( select  CONCAT( post.id,  ','  ,post.title,  ','  , post.alt_name)
    from    cms_post as post
    where  post.id=comments.post_id 
    order by comments.date
  ) as xxx
  limit 1
)
from cms_comments as comments
anonymous
()
Ответ на: комментарий от anonymous

1. После «order by» добавь desc, забыл поставить. Без desc он будет первую запись выводить. 2. Данные по комменту возвращаются одной строкой, может и не комильфо, зато скрипт красивый получился :D 3. Предполагаю что у тебя MySQL, в других БД такого может и не получиться. К примеру тот-же оракл плохо дружит с сортировкой внутри подзапроса, а limit и вовсе не опознаёт, приходится юзать кривоватый rownum...

anonymous
()
Ответ на: комментарий от anonymous

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

icq876974
() автор топика
Ответ на: комментарий от impr

Таким образом выборка идет, но в списке выводит только первого пользователя оставившего комментарий и список новостей выводится так же по дате первого оставленного комментария.

icq876974
() автор топика
Ответ на: комментарий от icq876974

Нужно добавить в кляуз where прямо перед order by. Не думаю, что это лучшее решение, но одно из (подозреваю лучшее решение будет работать на одном из диалектов sql и не будет работать на остальных).

winlook38 ★★
()
Ответ на: комментарий от icq876974

Действительно, как я мог такое написать.
and comments.date = (select max(c.date) from cms_comments where c.post_id = comments.postid and c.author = comments.author)
Наверное так.

winlook38 ★★
()
Ответ на: комментарий от winlook38

На lor аналогичный запрос сделан примерно так:

AND comments.id=(SELECT id FROM comments WHERE NOT deleted AND comments.topic=t.id ORDER BY postdate DESC LIMIT 1) 
maxcom ★★★★★
()
Ответ на: комментарий от maxcom

Да, я так и думал, что есть другие решения, но вот в Oracle, с которым мне приходится в основном работать, лимит устанавливается несколько иначе и усложняет запрос.

winlook38 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.