Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Здравствуйте.
Есть запрос
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. Как быть, что делать, что бы получить все поля, но группировать лишь по двум?
Не в сети
То есть что бы все поля вывести, мне их нужно все заталкать в groupBy.
Нет. Если ты все поля затолкаешь в group by, то группировка потеряет смысл. Это правило абсолютно логично, надо только его понять и принять.
Есть хороший пример: допустим у нас есть таблица людей с именами, возрастом и размером зарплаты. Допустим мы группируем по возрасту, что мы можем получить на выходе кроме возраста?
Имя - нет! Потому что может быть несколько человек одного возраста, непонятно какое имя брать из этих нескольких.
Зарплата - нет! По той же причине.
НО мы можем получить максимальную или среднюю зарплату по возрасту. То есть применить агрегатную функцию к полям, которые НЕ входят в список группировки. Понимаешь?
Допустим ты "выкрутишься" как собирался здесь, группируя и по возрасту, и по имени, и по зарплате. Что получишь на выходе? Да просто исходную таблицу
Итак, что ты хочешь получить, своими словами, и почему взялся группировать?
Не в сети
Это всё понятно.
Под словами "все поля занести в group bу", это значит, что бы запрос прошёл и ошибка не высветилась. Естественно, что мне левые поля не нужны в group by. Прямой запрос в БД проходит на ура, а вот через ларавель не выходит каменный цветок.
Судя твоему примеру - сгруппируем мы по возрасту, а имя и зарплата будут дублироваться. Ну и пусть, они же не уникальные. Главное что не будет дублей в колонке возраста, а имя или зарплата будет подставлено первое попавшееся значение из сгруппированных строк, по идее. Но это опять же в рамках допустимого, так как не уникальные поля.
П.С. А, всё понятно, всё решено. Для нуждающихся -
https://laracasts.com/discuss/channels/ … ot-working
Изменено Alexandr5 (12.09.2019 13:08:25)
Не в сети
Отменить ONLY_FULL_GROUP_BY или использовать ANY_VALUE() ? Ну если тебя устраивает такое "решение"...
Сервер MySQL ты победишь, но логику нет Мне кажется ты занимаешься самообманом. Однажды ты увидишь, что получил не то, что хотел.
It really should be called SURPRISE_ME()
Изменено doublevas (12.09.2019 13:31:11)
Не в сети
Ну, у меня до сих пор нет приличного опыта в этом и я не вижу конкретной "неправильности" в отмене "правильности"
Решено, я имел ввиду - стала понятна ошибка, почему нельзя вывести все поля, а группировать только по некоторым.
Вот именно тут мне придётся часть функционала выборки из sql перенести на php, так как на sql я не могу выбрать всё, сортируя по двум полям. Придётся выбрать всё, а на пхп подсчитать схожие записи.
Изменено Alexandr5 (12.09.2019 13:49:34)
Не в сети
Ты так и не сказал какая была цель. А мог бы получить подсказку.
Например: хотим вывести все поля таблицы Users(id, name, age, salary) + количество записей, совпадающих с текущим пользователем по возрасту. Или давай максимальную зарплату людей того же возраста. Похоже на твою невозможную группировку, да?
Можно решить с под-запросом:
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)
Не в сети
Ахаххх, хорошо быть мёртвым. Не нужно впахивать как живой
Есть таблица продуктов. В неё ложатся данные из . . .пока трёх таблиц. У неё два идентифицирующие поля, показывающих из какой таблицы товар - entity_type и entity_id. На странице выводятся данные товары из данной таблицы. Сейчас же, задача не просто выводить, а подсчитать сколько однотипного товара емеется и вывести его всего лишь раз с цифрой, обозначающей количество.
Например есть три игрушки - машинки, самолётики и корабли - для каждого типа своя таблица. Если раньше на странице выводилось.
Например - машинка белая, машинка чёрная, самолётик синий, самолётик красный, корабль жёлтый, корабль радужный.
Теперь должно вывести - машинка без разницы цвет, количество машинок. Самолётик без разницы цвет, количество самолётиков. Кораблик аналогично.
Изменено Alexandr5 (12.09.2019 14:52:39)
Не в сети
Страницы 1