Laravel Eloquent-distinct() и count () не работают должным образом вместе

поэтому я пытаюсь получить количество различных PID в запросе, но возвращаемое значение неверно.

это то, что я пытаюсь сделать:

$ad->getcodes()->groupby('pid')->distinct()->count()

что возвращает значение "2", в то время как значение, которое оно должно вернуть, должно быть"1".

в качестве обходного пути, я делаю это:

count($ad->getcodes()->groupby('pid')->distinct()->get())

что отлично работает и возвращает "1"

есть ли какое-либо правило, где count и distinct не могут быть в одном запросе? Я нахожу обходной путь "тяжелым", я бы как заставить исходный запрос работать : (

9 ответов


должно работать следующее

$ad->getcodes()->distinct('pid')->count('pid');

кто-нибудь еще сталкивался с этим сообщением и не находил других предложений для работы?

в зависимости от конкретного запроса может потребоваться другой подход. В моем случае мне нужно было либо подсчитать результаты a GROUP BY, например,

SELECT COUNT(*) FROM (SELECT * FROM a GROUP BY b)

или использовать COUNT(DISTINCT b):

SELECT COUNT(DISTINCT b) FROM a
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 вы возвращаете count для каждого сгруппированного элемента. Таким образом, агрегат первой строки-это просто количество первой группы (так что, вероятно, что-то низкое, как 1 или 2).

поэтому рассчитывать что Laravel выходит, но я совместил построитель запросов Laravel с некоторым необработанным 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();

посмотреть здесь для обсуждения..


попробуйте следующее:

$ad->getcodes()->groupby('pid')->distinct()->get()->count()

я столкнулся с той же проблемой.

Если вы устанавливаете панель отладки laravel, вы можете видеть запросы и часто видеть проблему

$ad->getcodes()->groupby('pid')->distinct()->count()

заменить на

$ad->getcodes()->distinct()->select('pid')->count()

вам нужно установить значения для возврата как разные. Если вы не установите поля select, он вернет все столбцы в базе данных, и все они будут уникальными. Поэтому установите запрос в distinct и выберите только столбцы, которые составляют ваше "отличное" значение, которое вы можете добавить больше. ->select('pid','date') в получите все уникальные значения для пользователя за день


DB::table('adverts')->distinct()->select('ad_advertiser')->get()

это работало для меня так попробовать это: $ad - >getcodes ()->distinct('pid') - >count ()