Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: выбрать все записи без повторов... DISTINCT
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » выбрать все записи без повторов... DISTINCT

Страниц (1): [1]
 

1. zuher - 14 Марта, 2016 - 19:55:19 - перейти к сообщению
Здравствуйте. Есть такой запрос:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM neformatnoe2013.cms_content WHERE published='1' AND uroven='0' AND category_id='33' ORDER BY id DESC LIMIT 16


Но мне надо чтобы запись была уникальна по user_id (т.е. один трек от пользователя, не больше). Попробовал так:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT DISTINCT user_id FROM neformatnoe2013.cms_content WHERE published='1' AND uroven='0' AND category_id='33' ORDER BY id DESC LIMIT 16


Выбирается только уникально поле user_id, а остальные записи из таблицы не вынимаются.
Помогите пожалуйста написать правильный запрос
2. MiksIr - 14 Марта, 2016 - 19:59:02 - перейти к сообщению
Одна запись - какая именно, любая?
3. zuher - 14 Марта, 2016 - 20:03:12 - перейти к сообщению
MiksIr пишет:
Одна запись - какая именно, любая?


По второму запросу он у меня выбирает все user_id, а остальные поля не выбирает (там около 20 полей), а надо наоборот выбрать все 20 записей, но чтобы две и более записей с одинаковым полем user_id не выбирались
4. MiksIr - 14 Марта, 2016 - 20:05:13 - перейти к сообщению
Воспрос был - из 5 записей с одинаковым user_id - какую именно запись показать?
5. Мелкий - 14 Марта, 2016 - 20:05:38 - перейти к сообщению
Postgresql:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT DISTINCT ON (user_id) user_id, /*остальные поля*/
  2. FROM neformatnoe2013.cms_content  WHERE published='1' AND uroven='0' AND category_id='33' ORDER BY user_id, id DESC LIMIT 16


Mysql. Общего решения нет. Частное, т.к. сортировка по id, возможно, но не лучшее:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT /*поля*/ FROM neformatnoe2013.cms_content JOIN (
  2. SELECT max(id) AS lastid FROM neformatnoe2013.cms_content WHERE published='1' AND uroven='0' AND category_id='33' GROUP BY user_id ORDER BY lastid DESC LIMIT 16
  3. ) lastuser ON lastid=id
6. zuher - 14 Марта, 2016 - 20:07:13 - перейти к сообщению
MiksIr пишет:
Воспрос был - из 5 записей с одинаковым user_id - какую именно запись показать?

Ну наверное логичнее последнюю
7. MiksIr - 14 Марта, 2016 - 20:10:56 - перейти к сообщению
Кому логично, кому нет, экстрасенсов тут нет

CODE (sql):
скопировать код в буфер обмена
  1. SELECT a.*
  2.   FROM neformatnoe2013.cms_content a
  3.       LEFT JOIN  neformatnoe2013.cms_content b
  4.       ON a.user_id=b.user_id AND a.id < b.id
  5.             AND b.published='1' AND b.uroven='0' AND b.category_id='33'
  6.   WHERE a.published='1' AND a.uroven='0' AND a.category_id='33' AND b.id IS NULL


Поправил чуток
8. zuher - 14 Марта, 2016 - 20:19:59 - перейти к сообщению
Мелкий
На первый пример:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ON (user_id) user_id, seolink,ifile,title,golos,gorod,zhanrtext FROM

MiksIr
Попробовал Ваш код, страница висела минуты полторы(это на локалке!!!) а потом вывела всё что угодно, но не DESC
Радость Радость Радость
Выхвачены случайные треки по всей базе, а не последние загруженные )))
9. MiksIr - 14 Марта, 2016 - 20:21:17 - перейти к сообщению
Поправленный попробовали?
Что бы не висело - на user_id, published, uroven и category_id должны быть индексы.
10. zuher - 14 Марта, 2016 - 20:25:55 - перейти к сообщению
Мелкий
Второй вариант твоего кода помог, спасибнуть не могу, рейтинга не хватает )))) Здорово Выпьем!
Спасибище всем за помощь!!!
(Добавление)
MiksIr пишет:
Поправленный попробовали?
Что бы не висело - на user_id, published, uroven и category_id должны быть индексы.

Да, после того как отписался, ещё поправленный попробовал - висеть перестало, но результат тот же. Он выкинул записи с 2009 по 2016 год, т.е. совершенно не последние )))
Помог вариант МЕЛКОГО
11. Мелкий - 14 Марта, 2016 - 20:37:20 - перейти к сообщению
zuher пишет:
На первый пример:

Ну так я же написал, что это для postgresql
12. MiksIr - 14 Марта, 2016 - 20:52:42 - перейти к сообщению
zuher пишет:
Он выкинул записи с 2009 по 2016 год, т.е. совершенно не последние

Значит запрос неверно набрали. Должен выводить записи с максимальным id для каждого user_id. Классическая задача поиска первой/последней записи в группе.

 

Powered by ExBB FM 1.0 RC1