Laravel по-русски

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

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

#1 12.09.2019 11:05:51

Группировка в запросе. Непонятно.

Здравствуйте.
Есть запрос

Product::where('', '')
	->select(\DB::raw('COUNT(*) AS counts, file_id, file_name'))
	->groupBy('file_id','file_name')->orderBy('created_at', 'desc')->get();

Если вот так, то всё хорошо. Если же мне нужны все поля в выборке, то
Ни так
   ->select(\DB::raw('COUNT(*) AS counts, product.*'))
Ни так не работает.
   ->select(\DB::raw('COUNT(*) AS counts, перечисление_всех_полей'))
И выходит ошибка
Syntax error or access violation: 1055 'БД.product.id' isn't in GROUP BY
То есть что бы все поля вывести, мне их нужно все заталкать в groupBy. Как быть, что делать, что бы получить все поля, но группировать лишь по двум?

Не в сети

#2 12.09.2019 11:42:24

Re: Группировка в запросе. Непонятно.

То есть что бы все поля вывести, мне их нужно все заталкать в groupBy.

Нет. Если ты все поля затолкаешь в group by, то группировка потеряет смысл. Это правило абсолютно логично, надо только его понять и принять.

Есть хороший пример: допустим у нас есть таблица людей с именами, возрастом и размером зарплаты. Допустим мы группируем по возрасту, что мы можем получить на выходе кроме возраста?
Имя - нет! Потому что может быть несколько человек одного возраста, непонятно какое имя брать из этих нескольких.
Зарплата - нет! По той же причине.
НО мы можем получить максимальную или среднюю зарплату по возрасту. То есть применить агрегатную функцию к полям, которые НЕ входят в список группировки. Понимаешь?
Допустим ты "выкрутишься" как собирался здесь, группируя и по возрасту, и по имени, и по зарплате. Что получишь на выходе? Да просто исходную таблицу smile

Итак, что ты хочешь получить, своими словами, и почему взялся группировать?

Не в сети

#3 12.09.2019 12:26:35

Re: Группировка в запросе. Непонятно.

Это всё понятно.
Под словами "все поля занести в group bу", это значит, что бы запрос прошёл и ошибка не высветилась. Естественно, что мне левые поля не нужны в  group by. Прямой запрос в БД проходит на ура, а вот через ларавель не выходит каменный цветок.
Судя твоему примеру - сгруппируем мы по возрасту, а имя и зарплата будут дублироваться. Ну и пусть, они же не уникальные. Главное что не будет дублей в колонке возраста, а имя или зарплата будет подставлено первое попавшееся значение из сгруппированных строк, по идее. Но это опять же в рамках допустимого, так как не уникальные поля.

П.С. А, всё понятно, всё решено. Для нуждающихся -
https://laracasts.com/discuss/channels/ … ot-working

Изменено Alexandr5 (12.09.2019 13:08:25)

Не в сети

#4 12.09.2019 13:27:08

Re: Группировка в запросе. Непонятно.

Отменить ONLY_FULL_GROUP_BY или использовать ANY_VALUE() ? Ну если тебя устраивает такое "решение"...
Сервер MySQL ты победишь, но логику нет smile Мне кажется ты занимаешься самообманом. Однажды ты увидишь, что получил не то, что хотел.

It really should be called SURPRISE_ME()

big_smile

Изменено doublevas (12.09.2019 13:31:11)

Не в сети

#5 12.09.2019 13:46:07

Re: Группировка в запросе. Непонятно.

Ну, у меня до сих пор нет приличного опыта в этом и я не вижу конкретной "неправильности" в отмене "правильности" big_smile
Решено, я имел ввиду - стала понятна ошибка, почему нельзя вывести все поля, а группировать только по некоторым.

Вот именно тут мне придётся часть функционала выборки из sql перенести на php, так как на sql я не могу выбрать всё, сортируя по двум полям. Придётся выбрать всё, а на пхп подсчитать схожие записи.

Изменено Alexandr5 (12.09.2019 13:49:34)

Не в сети

#6 12.09.2019 13:57:55

Re: Группировка в запросе. Непонятно.

Ты так и не сказал какая была цель. А мог бы получить подсказку.
Например: хотим вывести все поля таблицы Users(id, name, age, salary) + количество записей, совпадающих с текущим пользователем по возрасту. Или давай максимальную зарплату людей того же возраста. Похоже на твою невозможную группировку, да? smile

Можно решить с под-запросом:

SELECT 
  u.id, 
  u.name, 
  u.age, 
  (SELECT MAX(salary) FROM users WHERE age = u.age) AS max_salary
FROM 
  users AS u

Так должно работать. Этот запрос можно ещё переписать через JOIN, суть не поменяется.



Вот именно тут мне придётся часть функционала выборки из sql перенести на php, так как на sql я не могу выбрать всё, сортируя по двум полям. Придётся выбрать всё, а на пхп подсчитать схожие записи.

ой *ля-а-а-а-а! привыкнешь к такому и всё, ты умер как разработчик.

Изменено doublevas (12.09.2019 14:00:09)

Не в сети

#7 12.09.2019 14:48:20

Re: Группировка в запросе. Непонятно.

Ахаххх, хорошо быть мёртвым. Не нужно впахивать как живой big_smile

Есть таблица продуктов. В неё ложатся данные из . . .пока трёх таблиц. У неё два идентифицирующие поля, показывающих из какой таблицы товар - entity_type и entity_id. На странице выводятся данные товары из данной таблицы. Сейчас же, задача не просто выводить, а подсчитать сколько однотипного товара емеется и вывести его всего лишь раз с цифрой, обозначающей количество.
Например есть три игрушки - машинки, самолётики и корабли - для каждого типа своя таблица. Если раньше на странице выводилось.
Например - машинка белая, машинка чёрная, самолётик синий, самолётик красный, корабль жёлтый, корабль радужный.
Теперь должно вывести - машинка без разницы цвет, количество машинок. Самолётик без разницы цвет, количество самолётиков. Кораблик аналогично.

Изменено Alexandr5 (12.09.2019 14:52:39)

Не в сети

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