Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Добрый день. Суть вопроса:
Есть таблица, к примеру (id, name, time). Нужно написать запрос на ларе таким образом, что бы выводились только уникальные имена,
отсортировать по time DESC и paginate->(10)
Что то примерное придумал на чистом SQL, не знаю правильно ли, но не могу его на ларавеле написать:
Скорее всего не правильный, но все таки, как такой запрос написать на ларавеле:
SELECT DISTINCT max(time), name FROM `table` GROUP BY name ORDER BY time DESC
Или подскажите, более правильный запрос для моей задачи.
p.s.: последняя версия ларавеля, если вдруг это важно
Не в сети
Не в сети
Это я и сам видел, но там мало описания, и просто так вставив оно не работает как надо.
И так как я мало знаю ларавель, я обратился за помощью...
Не в сети
Это я и сам видел, но там мало описания, и просто так вставив оно не работает как надо.
так может сам по себе этот запрос работает не так как надо? я вот смотрю на описание задачи, на запрос и в упор не понимаю зачем там вообще нужен distinct? group by уже сам по себе гарантирует что все одинаковые имена «соберутся» в одну единственную запись и будут уникальны
Изменено constb (18.06.2017 14:15:19)
Не в сети
ps, дело, я думаю, не в том, что Вы плохо знаете "ларавель" (вообще-то лАравэл, раз уж хотите по-русски :-)).
Смотрите.
DISTINCT - удаляет из результатов выборки повторяющиеся одинаковые строки.
GROUP BY - агрегирующая функция, использование которой, само по себе, исключает наличие в выборке таких строк.
GROUP BY (name)... молчу.
Я бы Вам предложил, сначала, внимательно изучить устройство реляционных БД, затем SQL, хотя бы в основах. Я прошу не обижаться, просто, если этого не сделать, подобные вопросы будут возникать каждые пять минут.
P.S.
constb, извините, похоже, писали ответ одновременно.
Изменено Androbim (18.06.2017 14:23:29)
Не в сети
Это я и сам видел, но там мало описания, и просто так вставив оно не работает как надо.
так может сам по себе этот запрос работает не так как надо? я вот смотрю на описание задачи, на запрос и в упор не понимаю зачем там вообще нужен 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)
Не в сети
кажется частично разобрался, ошибку выбивало из-за мода mysql, в конфигах прописал 'modes' => [], и все норм
Не в сети
а! only full group by – это вообще-то правильно, большинство СУБД требуют этого, только mysql допускает вольности. можно вернуть strict mode и заменить name в select на max(name)
Не в сети
а! only full group by – это вообще-то правильно, большинство СУБД требуют этого, только mysql допускает вольности. можно вернуть strict mode и заменить name в select на max(name)
делал max(name) и пишет что такого столбика нет в бд
Не в сети
интересно. я подумал и пришёл к выводу что 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()
Не в сети
$names = YourTable::select('name')->latest()->distinct()->paginate(10);
Изменено vladislavTkachenko (19.06.2017 09:29:21)
Не в сети
$names = YourTable::select('name')->latest()->distinct()->paginate(10);
нет это не то, я уже написал свой запрос, там оказалось на много проще и без distinct().
Не в сети
Страницы 1