Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 17.06.2017 23:55:40

SQL Запрос c DISTINCT

Добрый день. Суть вопроса:

Есть таблица, к примеру (id, name, time). Нужно написать запрос на ларе таким образом, что бы выводились только уникальные имена,
отсортировать по time DESC и paginate->(10)

Что то примерное придумал на чистом SQL, не знаю правильно ли, но не могу его на ларавеле написать:

Скорее всего не правильный, но все таки, как такой запрос написать на ларавеле:
SELECT DISTINCT max(time), name FROM `table` GROUP BY name ORDER BY time DESC
Или подскажите, более правильный запрос для моей задачи.

p.s.: последняя версия ларавеля, если вдруг это важно

Не в сети

#2 18.06.2017 09:19:22

Не в сети

#3 18.06.2017 13:29:46

Re: SQL Запрос c DISTINCT

Это я и сам видел, но там мало описания, и просто так вставив оно не работает как надо.
И так как я мало знаю ларавель, я обратился за помощью...

Не в сети

#4 18.06.2017 14:15:05

Re: SQL Запрос c DISTINCT

Это я и сам видел, но там мало описания, и просто так вставив оно не работает как надо.

так может сам по себе этот запрос работает не так как надо? я вот смотрю на описание задачи, на запрос и в упор не понимаю зачем там вообще нужен distinct? group by уже сам по себе гарантирует что все одинаковые имена «соберутся» в одну единственную запись и будут уникальны

Изменено constb (18.06.2017 14:15:19)

Не в сети

#5 18.06.2017 14:20:52

Re: SQL Запрос c DISTINCT

ps, дело, я думаю, не в том, что Вы плохо знаете "ларавель" (вообще-то лАравэл, раз уж хотите по-русски :-)).
Смотрите.
DISTINCT - удаляет из результатов выборки повторяющиеся одинаковые строки. 
GROUP BY - агрегирующая функция, использование которой, само по себе,   исключает наличие в выборке таких строк.
GROUP BY (name)... молчу.
Я бы Вам предложил, сначала, внимательно изучить устройство реляционных БД, затем SQL, хотя бы в основах. Я прошу не обижаться, просто, если этого не сделать, подобные вопросы будут возникать каждые пять минут.

P.S.
constb, извините, похоже, писали ответ одновременно.

Изменено Androbim (18.06.2017 14:23:29)

Не в сети

#6 18.06.2017 14:24:04

Re: SQL Запрос c DISTINCT

constb пишет:

Это я и сам видел, но там мало описания, и просто так вставив оно не работает как надо.

так может сам по себе этот запрос работает не так как надо? я вот смотрю на описание задачи, на запрос и в упор не понимаю зачем там вообще нужен distinct? group by уже сам по себе гарантирует что все одинаковые имена «соберутся» в одну единственную запись и будут уникальны

потому что ошибку выбивает груп бай

SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'social.facebook_m.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by (SQL: select * from `facebook_m` where `user` = 4 group by `chat` order by `time` desc limit 10 offset 0)

Не в сети

#7 18.06.2017 16:51:32

Re: SQL Запрос c DISTINCT

кажется частично разобрался, ошибку выбивало из-за мода mysql, в конфигах прописал 'modes'  => [], и все норм

Не в сети

#8 18.06.2017 17:26:04

Re: SQL Запрос c DISTINCT

а! only full group by – это вообще-то правильно, большинство СУБД требуют этого, только mysql допускает вольности. можно вернуть strict mode и заменить name в select на max(name) smile

Не в сети

#9 18.06.2017 21:20:24

Re: SQL Запрос c DISTINCT

constb пишет:

а! only full group by – это вообще-то правильно, большинство СУБД требуют этого, только mysql допускает вольности. можно вернуть strict mode и заменить name в select на max(name) smile

делал max(name) и пишет что такого столбика нет в бд big_smile

Не в сети

#10 19.06.2017 05:10:48

Re: SQL Запрос c DISTINCT

интересно. я подумал и пришёл к выводу что max(name) делать незачем, просто ты в get() не передаёшь имена выбираемых полей и из-за этого у тебя ошибка возникает из-за присутствия неагрегированных полей в выборке.

select * from `facebook_m` where `user` = 4 group by `chat` order by `time` desc limit 10 offset 0

вот же твой запрос, во-первых не вижу никакого max(time), зато вижу *

кроме этого – нет столбика, потому что по умолчанию построитель искейпит идентификаторы в запросах, то есть mysql реально ищет столбец с именем max(time). для того чтобы объяснить ему что это выражение, надо использовать \DB::raw()

Не в сети

#11 19.06.2017 09:27:13

Re: SQL Запрос c DISTINCT

$names = YourTable::select('name')->latest()->distinct()->paginate(10);

Изменено vladislavTkachenko (19.06.2017 09:29:21)

Не в сети

#12 19.06.2017 15:21:45

Re: SQL Запрос c DISTINCT

vladislavTkachenko пишет:

$names = YourTable::select('name')->latest()->distinct()->paginate(10);

нет это не то, я уже написал свой запрос, там оказалось на много проще и без distinct().

Не в сети

Подвал раздела