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
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();
я столкнулся с той же проблемой.
Если вы устанавливаете панель отладки laravel, вы можете видеть запросы и часто видеть проблему
$ad->getcodes()->groupby('pid')->distinct()->count()
заменить на
$ad->getcodes()->distinct()->select('pid')->count()
вам нужно установить значения для возврата как разные. Если вы не установите поля select, он вернет все столбцы в базе данных, и все они будут уникальными. Поэтому установите запрос в distinct и выберите только столбцы, которые составляют ваше "отличное" значение, которое вы можете добавить больше. ->select('pid','date')
в получите все уникальные значения для пользователя за день