- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
SELECT * FROM (
SELECT `comments`.`user`,
`comments`.`time`,
`comments`.`topic`,
`comments`.`id` AS `commid`,
`topic`.`name`,
`topic`.`id`,
`topic`.`translit`,
`topic`.`blog`,
`user`.`login`
FROM `comments`, `topic`, `user`
WHERE
`comments`.`topic` IN (
SELECT DISTINCT `topic`
FROM `comments`
ORDER BY `time` DESC)
AND `topic`.`id` = `comments`.`topic`
AND `user`.`id` = `comments`.`user`
ORDER BY `comments`.`time` DESC
) `data`
GROUP BY `data`.`topic`
ORDER BY `data`.`time` DESC
LIMIT 10
Efog 11.10.2014 20:59 # 0
inkanus-gray 11.10.2014 21:07 # +1
Efog 11.10.2014 21:08 # 0
inkanus-gray 11.10.2014 22:16 # +1
Efog 11.10.2014 22:17 # 0
inkanus-gray 11.10.2014 22:21 # +1
WHERE `comments`.`topic` IN (список айдишников) ограничивает результаты... списком всех айдишников. Т. е. ничего полезного не делает. И даже ORDER BY `time` и DISTINCT никак на результат не повлияют.
Efog 11.10.2014 22:22 # 0
LIMIT не заметил?
inkanus-gray 11.10.2014 22:23 # +1
Efog 11.10.2014 22:25 # 0
Стоп, странно.
Оно ведь без этого не работает.
WTF?!
inkanus-gray 11.10.2014 22:36 # +1
Efog 11.10.2014 22:39 # 0
istem 11.10.2014 22:42 # +2
Efog 11.10.2014 22:43 # 0
inkanus-gray 11.10.2014 22:44 # +1
Efog 11.10.2014 22:45 # 0
inkanus-gray 11.10.2014 22:46 # +2
Efog 11.10.2014 22:47 # 0
barop 19.03.2017 01:31 # 0
майсикуельщик наверное?
huesto 19.03.2017 10:12 # 0
istem 11.10.2014 21:54 # +1
Ехал `comments` через `comments`,
Видит `comments`: `comments`, `comments`!
Сунул `comments` `comments` в `comments`,
`Сomments` `comments` `comments` `comments`.
defecate-plusplus 12.10.2014 00:39 # +2
автору выдать судебный запрет на приближение к субд ближе, чем на 1 км
bormand 12.10.2014 08:39 # +1
Да он и так не с СУБД работает...
inkanus-gray 12.10.2014 08:54 # 0
bormand 12.10.2014 09:25 # 0
Да простит меня d++, если я где-то косячу.
bormand 12.10.2014 09:59 # 0
inkanus-gray 12.10.2014 10:58 # 0
defecate-plusplus 12.10.2014 12:07 # 0
вы либо трусы наденьте, либо крестик снимите
либо topic_id, max(id) либо group by
> В СУБД это выглядело бы примерно так
если стояла задача заселектить по одной штуке самого последнего комментария из каждого топика, то да, только order by time desc
кроме того, интуитивно хочется как-то вписать дополнительной фильтр, сокращающий задачу субд,
т.к. пока база маленькая, запрос будет нормально работать, но если в comments уже миллион записей, становится накладно сразу по всем бегать и сортировать - учитывая, что наверняка приложению прямо сейчас нужны ой далеко не все
bormand 12.10.2014 12:46 # +1
Да, тупанул я.
> дополнительный фильтр
Ну, я так понял, что ОП мутит что-то типа ГК'шного стока. Что-то никакие фильтры тут в голову не приходят.
Имхо, если эти данные будут выбираться часто - можно немножко денормализовать базу, чтобы не искать эти максимумы-по-группе каждый раз...
defecate-plusplus 12.10.2014 13:04 # +1
именно, в topic засунуть пару лишних колонок о последнем комменте (время, айди), и поддерживать их состояние
если делать движок какого-нибудь суперпопулярного форума с миллионами постов, чтобы на страницу 68 попали правильно отсортированные темы с указанием последнего поста, и при этом запрос не исполнялся по 15 секунд
anonimb84a2f6fd141 12.10.2014 22:22 # −1
guest 18.10.2014 11:29 # −1
select id,topic_id from comments group by topic_id having id=max(id)
bormand 18.10.2014 11:53 # +1
defecate-plusplus 20.10.2014 10:19 # +2
все значения, которые употребляются в having, уже должны быть в сгруппированном результате - т.к. он работает после группировки
но группировка у тебя не сработает, т.к. либо id надо добавить в груп бай, что бред, либо id убрать из селект - и снова промах
bormand 20.10.2014 11:14 # 0
barop 19.03.2017 01:27 # 0
а в говнобазе для неосиляторов майсцыкуль никак по другому