Подтвердить что ты не робот

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

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

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

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

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

Как обходной путь, я делаю это:

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

В зависимости от конкретного запроса может потребоваться другой подход. В моем случае мне нужно было либо подсчитать результаты 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 позже, если вам это нужно для получения строк.

Ответ 3

Более общий ответ, который сэкономил бы мне время и, надеюсь, другие:

Не работает (возвращает количество всех строк):

DB::table('users')
            ->select('first_name')
            ->distinct()
            ->count();

Исправление:

DB::table('users')
            ->distinct()
            ->count('first_name');

Ответ 4

У меня была аналогичная проблема, и я нашел способ обойти ее.

Проблема заключается в том, как построитель запросов Laravel обрабатывает агрегаты. Он возвращает первый результат и возвращает значение "aggregate". Обычно это нормально, но когда вы комбинируете count с groupBy, вы возвращаете счет за сгруппированный элемент. Таким образом, агрегат первой строки - это просто счет первой группы (так что, вероятно, что-то вроде 1 или 2).

Итак, счет Laravel отсутствует, но я объединил построитель запросов Laravel с некоторым сырым SQL, чтобы получить точное количество моих сгруппированных результатов.

В вашем примере, я ожидаю, что следующее будет работать (и позволит вам избежать получения):

$query = $ad->getcodes()->groupby('pid')->distinct();
$count = count(\DB::select($query->toSql(), $query->getBindings()));

Если вы хотите убедиться, что не тратите время на выбор всех столбцов, вы можете избежать этого при построении запроса:

 $query = $ad->select(DB::raw(1))->getcodes()->groupby('pid')->distinct();

Ответ 5

Не работает ли это?

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

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

Ответ 6

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

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

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

измените на

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

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

Ответ 7

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

Ответ 8

Distinct не принимают аргументы, так как он добавляет DISTINCT в ваш SQL-запрос, однако вам, МОЖНО, нужно определить имя столбца, с которым вы хотите выбрать отличительный. Таким образом, если у вас есть Flight->select('project_id')->distinct()->get() Different Flight->select('project_id')->distinct()->get(), эквивалентный SELECT DISTINCT 'project_id' FROM flights и вы можете теперь добавить другие модификаторы, такие как count() или даже необработанный eloquent запросы.

Ответ 9

$solution = $query->distinct()
            ->groupBy
            (
                [
                    'array',
                    'of',
                    'columns',
                ]
            )
            ->addSelect(
                [
                    'columns',
                    'from',
                    'the',
                    'groupby',
                ]
            )
            ->get();

Помните, что группа by является необязательной, это должно работать в большинстве случаев, когда вы хотите, чтобы группа счетчиков исключала дублированные значения выбора, addSelect - это метод экземпляра querybuilder.

Ответ 10

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

Ответ 11

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

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

Ответ 12

Это работало для меня так Попробуй это: $ Ad- > getcodes() → различны ( 'PID') → счетчик()