Laravel Eloquent - Different () и Count () не работают вместе

59

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

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

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

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

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

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

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

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

  • 0
    Что у вас есть в вашей таблице образцов в базе данных? А чего ты хочешь добиться? Теперь вы, вероятно, должны получить число различных значений в столбце pid , поэтому, если в вашей таблице 2 записи - одна с pid 1, вторая с pid 2, count должен возвращать 2.
  • 0
    Вы можете просто заменить get на count следующим образом: $count = DB::table('tablename')->count(DB::raw('DISTINCT pid')); также может делать: DB::table('tablename')->distinct('pid')->count('pid');
Теги:
eloquent
count
distinct

12 ответов

74
Лучший ответ

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

$ad->getcodes()->distinct('pid')->count('pid');
  • 2
    У меня была похожая проблема, и она, кажется, просто не groupBy группу.
  • 5
    К сожалению, это не работает.
Показать ещё 5 комментариев
9

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

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

  • 0
    хороший совет! это сработало для меня как шарм.
  • 0
    Откуда взялся $ builder?
Показать ещё 1 комментарий
8

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

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

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

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

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

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

Проблема заключается в том, как построитель запросов 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();
1

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

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

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

  • 3
    Это не хорошее решение, потому что вызов get() выполнит запрос и вернет результаты из базы данных, а затем count() запустится в Collection.
0

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

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

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

0

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

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

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

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

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

измените на

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

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

0

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

$ad->getcodes()->groupby('pid')->distinct()->get()->count()
  • 5
    это неправильно, приятель, чего я стараюсь избегать, так это вызова метода get (). В любом случае, вышеприведенное не работает, так как возвращает 0; но спасибо за ответ!
-2

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

  • 0
    Привет добро пожаловать в ТАК. При ответе на вопрос, пожалуйста, предоставьте дополнительную информацию о коде, который вы предоставляете. Вклады, подобные этому, приветствуются, но другие в будущем могут выиграть от объяснения

Ещё вопросы

Сообщество Overcoder
Наверх
Меню