Выборка одной статьи каждого автора

Фанат

oncle terrible
Команда форума
сформулируй-ка задачу поточнее.
надо вывести 6 последних публикаций, но при этом обязательно разных авторов?
а если автора нету - то этот анонимус может повторяться, или тоже только один раз?

или тебе надо по 6 последних статей разных авторов?

напиши внятно и подробно, что тебе нужно
 

WMix

герр M:)ller
Партнер клуба
Какая у тебя версия mysql?
я не тестил, я на глаз... ну не подходит, фиг бы с ним...
но если ты используешь запрос как табличку, почему бы join к ней не написать, а не заворачивать в новый селект

PHP:
select *
FROM ( 
      SELECT MAX(n1.`id`) id FROM `crm_news` n1 GROUP BY `id_person` LIMIT 6 
   ) `id` 
left join `crm_news` n2 on id.id = n2.id
....
Смысл в том, что надо выбрать статьи, а не авторов вначале. И не у всех статей есть авторство )
это новое условие, если автор IS NULL то только одну новость этого автора али как?
 

fixxxer

К.О.
Партнер клуба
для начала включаем strict mode и перестаем использовать group by некорректно

после чего понимаем, что нормального решения без временных таблиц нет (в более продвинутых субд можно было бы использовать with / connect by)

впрочем, если учитывать внутренности innodb (а именно упорядоченность по PK), можно умышленно использовать group by некорректно, но это очень нехороший хак, и все может в один прекрасный момент сломаться
 

mihdan

Новичок
сформулируй-ка задачу поточнее.
надо вывести 6 последних публикаций, но при этом обязательно разных авторов?
а если автора нету - то этот анонимус может повторяться, или тоже только один раз?

или тебе надо по 6 последних статей разных авторов?

напиши внятно и подробно, что тебе нужно
6 последних публикация из crm_news, отсортированных по дате. Если автор не указан - выводит не нужно. Автора (crm_persons) разные.

Сейчас на сайте в блоке "ТОЧКА ЗРЕНИЯ" уже выводятся публикации, сгруппированные по автору, но не последние (СМ. автор Михаил Кобзарев)
 

mihdan

Новичок
я не тестил, я на глаз... ну не подходит, фиг бы с ним...
но если ты используешь запрос как табличку, почему бы join к ней не написать, а не заворачивать в новый селект

PHP:
select *
FROM ( 
      SELECT MAX(n1.`id`) id FROM `crm_news` n1 GROUP BY `id_person` LIMIT 6 
   ) `id` 
left join `crm_news` n2 on id.id = n2.id
....
это новое условие, если автор IS NULL то только одну новость этого автора али как?
Автор не может повторяться при выводе, только уникальные 6 авторов и их последняя публикация
 

WMix

герр M:)ller
Партнер клуба
ну откинь все новости без автора! where author is not null
 

fixxxer

К.О.
Партнер клуба
блин, ну ты умеешь криво формулировать!
это как раз решается безо всяких группировок
обычным self join

mysql> select * from articles order by id;
+----+-----------+
| id | author_id |
+----+-----------+
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
| 4 | 3 |
| 5 | 2 |
| 6 | 3 |
| 7 | 1 |
| 8 | 2 |
| 9 | 3 |
| 10 | 2 |
| 11 | 4 |
| 12 | 4 |
| 13 | 5 |
| 14 | 5 |
| 15 | 4 |
| 16 | 6 |
| 17 | 1 |
| 18 | 6 |
| 19 | 6 |
| 20 | 7 |
| 21 | 3 |
| 22 | 1 |
+----+-----------+
22 rows in set (0.00 sec)

mysql> select ar.id, ar.author_id from articles ar left join articles ar1 on (ar1.author_id = ar.author_id and ar1.id > ar.id) where ar1.id is null order by ar.id desc limit 6;
+----+-----------+
| id | author_id |
+----+-----------+
| 22 | 1 |
| 21 | 3 |
| 20 | 7 |
| 19 | 6 |
| 15 | 4 |
| 14 | 5 |
+----+-----------+
6 rows in set (0.00 sec)

хорошая кстати задачка для собеседования хехе
 

WMix

герр M:)ller
Партнер клуба
select ar.id, ar.author_id from articles ar left join articles ar1 on (ar1.author_id = ar.author_id and ar1.id > ar.id) where ar1.id is null order by ar.id desc limit 6;
да, прикольно...
я не умею так думать... самозаджойниться чтоб обойти group by...

тоже самое ;)
PHP:
select author_id, max(id) 
from news 
group by author_id 
limit 6
 

Вурдалак

Продвинутый новичок
WMix, у тебя нет сортировки. Ты берёшь 6 каких-то случайных авторов.
 

WMix

герр M:)ller
Партнер клуба
mihdan
то что написал fixxxer подходит для всего... дальше имея знания, собери в кучу и запости ответ!
 

mihdan

Новичок
блин, ну ты умеешь криво формулировать!
это как раз решается безо всяких группировок
обычным self join
Запрос выполнялся полторы минуты :) Результата ноль. Сортировка должна быть по дате. Имя автора также необходимо (crm_persons)

PHP:
select ar.id, ar.id_person from crm_news ar 
left join crm_news ar1 on (ar1.id_person = ar.id_person and ar1.id > ar.id) 
where ar1.id is null 
order by ar.`date` desc LIMIT 6;
 

fixxxer

К.О.
Партнер клуба
это не ответ для копипаста, надо включить головной мозг. показана суть решения
 

mihdan

Новичок
это не ответ для копипаста, надо включить головной мозг. показана суть решения
И что я сделал не так? Что в запросе такого, что он выполняется бесконечно долго, хотя есть лимит?

PHP:
select ar.id, ar.id_person from crm_news ar 
left join crm_news ar1 on (ar1.id_person = ar.id_person and ar1.id > ar.id) 
where ar1.id is null 
order by ar.`date` desc LIMIT 6;
 

fixxxer

К.О.
Партнер клуба
еще раз скопипасть, а то я со второго раза не понял
 

Baton

Новичок
fixxxer
Если не сложно, поясни пожалуйста почему "and ar1.id > ar.id" ты поместил в ON а не в WHERE?

Я давно размышляю над этой темой, но никак не могу уловить разницы. Все запросы в которых я использовал уточнение в ON возвращали точно такой же рез-те если их перенести в WHERE, а вот здесь если перенести в WHERE запрос не работает. Не могу упустить такой момент, чтобы не спросить :)
 

fixxxer

К.О.
Партнер клуба
Baton
иначе не получим null

WMix
в твоем случае придется сделать еще один запрос, чтобы по max(id) достать тексты сообщений. или пытаться извратиться с подзапросами, а с ними в mysql беда

mihdan
считай что мой id это твой datetime, предполагается что он уникален в рамках автора. касаемо производительности надо думать про индексы, для начала надо чтобы просто работало
 
Сверху