Laravel Eloquent-distinct () и count () не работают должным образом вместе
поэтому я пытаюсь получить количество различных PID в запросе, но возвращаемое значение неверно.
вот что я пытаюсь сделать:
$ad->getcodes()->groupby('pid')->distinct()->count()
что возвращает значение "2", в то время как значение, которое он должен вернуть, должно быть"1".
в качестве обходного пути, я делаю это:
count($ad->getcodes()->groupby('pid')->distinct()->get())
что отлично работает и возвращает "1"
есть ли правило, где count и distinct не могут быть в одном запросе? Я нахожу обходной путь своего рода "тяжелым", я бы как сделать исходный запрос работы : (
9 ответов:
кто - нибудь еще сталкивался с этим сообщением и не находил других предложений для работы?
в зависимости от конкретного запроса может потребоваться другой подход. В моем случае мне нужно было либо подсчитать результаты a
GROUP BY, например,SELECT COUNT(*) FROM (SELECT * FROM a GROUP BY b)или использовать
COUNT(DISTINCT b):SELECT COUNT(DISTINCT b) FROM aпосле некоторого озадачивания я понял, что для этого нет встроенной функции Laravel. Поэтому самым простым решением было использовать
DB::rawСcountметод.$count = $builder->count(DB::raw('DISTINCT b'));помните, Не используйте
groupByперед вызовомcount. Вы можете подать заявкуgroupByпозже, если вам это нужно для получения строк.
более общий ответ, который сэкономил бы мне время, и, надеюсь, другие:
не работает (возвращает количество всех строк):
DB::table('users') ->select('first_name') ->distinct() ->count();исправления:
DB::table('users') ->distinct() ->count('first_name');
у меня была аналогичная проблема, и я нашел способ обойти ее.
проблема заключается в том, как конструктор запросов Laravel обрабатывает агрегаты. Он принимает первый возвращенный результат, а затем возвращает значение "aggregate". Обычно это нормально, но когда вы объединяете count с groupBy, вы возвращаете счетчик на сгруппированный элемент. Таким образом, агрегат первой строки-это всего лишь количество первой группы (поэтому вероятно что-то низкое, например 1 или 2).
поэтому рассчитывать что Laravel выходит, но я совместил Laravel query builder с некоторым необработанным SQL, чтобы получить точное количество моих сгруппированных результатов.
для вашего примера, я ожидаю, что следующее должно работать (и позволит вам избежать get):
$query = $ad->getcodes()->groupby('pid')->distinct(); $count = count(\DB::select($query->toSql(), $query->getBindings()));Если вы хотите убедиться, что вы не тратите время на выбор всех столбцов, вы можете избежать этого при построении запроса:
$query = $ad->select(DB::raw(1))->getcodes()->groupby('pid')->distinct();
не работает?
$ad->getcodes()->distinct()->get(['pid'])->count();посмотреть здесь для обсуждения..
я столкнулся с той же проблемой.
Если вы устанавливаете панель отладки laravel, вы можете видеть запросы и часто видеть проблему
$ad->getcodes()->groupby('pid')->distinct()->count()заменить на
$ad->getcodes()->distinct()->select('pid')->count()вам нужно установить значения для возврата как разные. Если вы не установите поля select, он вернет все столбцы в базе данных, и все они будут уникальными. Поэтому установите запрос в distinct и выберите только столбцы, которые составляют ваше значение "distinct", которое вы можете добавить больше.
->select('pid','date')to получить все уникальные значения для пользователя в день
Comments