Итак, я пытаюсь получить количество различных сообщений в запросе, но возвращаемое значение неверно.
Это то, что я пытаюсь сделать:
$ad->getcodes()->groupby('pid')->distinct()->count()
что возвращает значение "2", а значение, которое оно должно вернуть, должно быть "1".
Как обходной путь, я делаю это:
count($ad->getcodes()->groupby('pid')->distinct()->get())
что отлично работает и возвращает "1"
Есть ли какое-либо правило, когда count и distinct не могут быть в одном запросе? Я обнаружил, что обходной путь "тяжелый", я хотел бы сделать исходный запрос: (
Следующее должно работать
$ad->getcodes()->distinct('pid')->count('pid');
groupBy
группу.
Кто-нибудь еще сталкивается с этим сообщением и не находит другие предложения для работы?
В зависимости от конкретного запроса может потребоваться другой подход. В моем случае мне нужно было либо подсчитать результаты 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 с некоторым сырым 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();
Не работает ли это?
$ad->getcodes()->distinct()->get(['pid'])->count();
Смотрите здесь для обсуждения..
get()
выполнит запрос и вернет результаты из базы данных, а затем count()
запустится в Collection.
$ad->getcodes()->distinct()->count('pid');
$solution = $query->distinct()
->groupBy
(
[
'array',
'of',
'columns',
]
)
->addSelect(
[
'columns',
'from',
'the',
'groupby',
]
)
->get();
Помните, что группа by является необязательной, это должно работать в большинстве случаев, когда вы хотите, чтобы группа счетчиков исключала дублированные значения выбора, addSelect - это метод экземпляра querybuilder.
Distinct не принимают аргументы, так как он добавляет DISTINCT в ваш SQL-запрос, однако вам, МОЖНО, нужно определить имя столбца, с которым вы хотите выбрать отличительный. Таким образом, если у вас есть Flight->select('project_id')->distinct()->get()
Different Flight->select('project_id')->distinct()->get()
, эквивалентный SELECT DISTINCT 'project_id' FROM flights
и вы можете теперь добавить другие модификаторы, такие как count() или даже необработанный eloquent запросы.
DB::table('adverts')->distinct()->select('ad_advertiser')->get()
Я столкнулся с той же проблемой.
Если вы устанавливаете панель отладки laravel, вы можете видеть запросы и часто видеть проблему
$ad->getcodes()->groupby('pid')->distinct()->count()
измените на
$ad->getcodes()->distinct()->select('pid')->count()
Вам нужно установить значения, которые будут возвращаться как разные. Если вы не установите поля выбора, он вернет все столбцы в базе данных, и все они будут уникальными. Поэтому установите запрос в отдельный и выберите только столбцы, которые составляют ваше "отличное" значение, которое вы, возможно, захотите добавить. ->select('pid','date')
, чтобы получить все уникальные значения для пользователя за один день
Попробуйте следующее:
$ad->getcodes()->groupby('pid')->distinct()->get()->count()
Это работало для меня так Попробуй это: $ Ad- > getcodes() → различны ( 'PID') → счетчик()
pid
, поэтому, если в вашей таблице 2 записи - одна с pid 1, вторая с pid 2, count должен возвращать 2.$count = DB::table('tablename')->count(DB::raw('DISTINCT pid'));
также может делать:DB::table('tablename')->distinct('pid')->count('pid');