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



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



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



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


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



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



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


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



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

794   9  

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

после некоторого озадачивания я понял, что для этого нет встроенной функции 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();

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

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

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

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

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

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

заменить на

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

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

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

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

Comments

    Ничего не найдено.