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

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

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

напиши внятно и подробно, что тебе нужно
 
Какая у тебя версия 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 то только одну новость этого автора али как?
 
для начала включаем strict mode и перестаем использовать group by некорректно

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

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

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

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

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

Сейчас на сайте в блоке "ТОЧКА ЗРЕНИЯ" уже выводятся публикации, сгруппированные по автору, но не последние (СМ. автор Михаил Кобзарев)
 
я не тестил, я на глаз... ну не подходит, фиг бы с ним...
но если ты используешь запрос как табличку, почему бы 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 авторов и их последняя публикация
 
ну откинь все новости без автора! where author is not null
 
блин, ну ты умеешь криво формулировать!
это как раз решается безо всяких группировок
обычным 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)

хорошая кстати задачка для собеседования хехе
 
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
 
mihdan
то что написал fixxxer подходит для всего... дальше имея знания, собери в кучу и запости ответ!
 
блин, ну ты умеешь криво формулировать!
это как раз решается безо всяких группировок
обычным 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;
 
это не ответ для копипаста, надо включить головной мозг. показана суть решения
 
это не ответ для копипаста, надо включить головной мозг. показана суть решения

И что я сделал не так? Что в запросе такого, что он выполняется бесконечно долго, хотя есть лимит?

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
Если не сложно, поясни пожалуйста почему "and ar1.id > ar.id" ты поместил в ON а не в WHERE?

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

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

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