Portanto, estou tentando obter o número de pids distintos em uma consulta, mas o valor retornado está errado.
Isso é o que tento fazer:
$ad->getcodes()->groupby('pid')->distinct()->count()
o que retorna o valor "2", enquanto o valor que deve retornar, deve ser "1".
Como solução alternativa, estou fazendo o seguinte:
count($ad->getcodes()->groupby('pid')->distinct()->get())
o que funciona bem e retorna "1"
Existe alguma regra em que contagem e distinção não podem estar na mesma consulta? Acho a solução alternativa meio "pesada", gostaria de fazer a consulta original funcionar :(
pid
coluna, então se você tiver em sua tabela 2 registros - um com pid 1, o segundo com pid 2, a contagem deve retornar 2.$count = DB::table('tablename')->count(DB::raw('DISTINCT pid'));
também pode fazer:DB::table('tablename')->distinct('pid')->count('pid');
Respostas:
O seguinte deve funcionar
fonte
groupBy
o truque.count()
parece desabilitar ou descartar odistinct()
. UsegroupBy()
conforme descrito ao longo da pergunta. Edit: estou descobrindo que mesmogroupBy()
está fornecendo umacount()
comparação diferente deget()
seguido pela contagem da matriz resultante.distinct()
função não aceita argumentos. Você pode alterá-lo para$ad->getcodes()->distinct()->count('pid');
com o mesmo resultado.Uma resposta mais genérica que teria economizado meu tempo e, espero, outras:
Não funciona (retorna a contagem de todas as linhas):
O conserto:
fonte
Alguém mais encontrou esta postagem e não encontrou as outras sugestões para funcionar?
Dependendo da consulta específica, uma abordagem diferente pode ser necessária. No meu caso, eu precisava contar os resultados de um
GROUP BY
, por exemploou use
COUNT(DISTINCT b)
:Depois de algumas confusões, percebi que não havia nenhuma função embutida do Laravel para nenhum deles. Portanto, a solução mais simples era usar
DB::raw
com ocount
método.Lembre-se, não use
groupBy
antes de ligarcount
. Você pode se inscrevergroupBy
mais tarde, se precisar, para obter linhas.fonte
$books = Book::where(...)->count(...)
->count(DB::raw('DISTINCT b'))
gere a mesma consulta SQL que->distinct()->count('b')
Tive um problema semelhante e encontrei uma maneira de contorná-lo.
O problema é a maneira como o construtor de consultas do Laravel lida com os agregados. Ele pega o primeiro resultado retornado e retorna o valor 'agregado'. Isso geralmente é bom, mas quando você combina a contagem com groupBy, você retorna uma contagem por item agrupado. Portanto, o agregado da primeira linha é apenas uma contagem do primeiro grupo (portanto, algo baixo como 1 ou 2 é provável).
Então a contagem do Laravel acabou, mas eu combinei o construtor de consultas do Laravel com algum SQL bruto para obter uma contagem precisa dos meus resultados agrupados.
Para o seu exemplo, espero que o seguinte funcione (e permita que você evite get):
Se quiser ter certeza de que não está perdendo tempo selecionando todas as colunas, você pode evitar isso ao criar sua consulta:
fonte
Eu me deparei com o mesmo problema.
Se você instalar a barra de depuração laravel, você pode ver as consultas e frequentemente ver o problema
mudar para
Você precisa definir os valores para retornar como distintos. Se você não definir os campos selecionados, todas as colunas do banco de dados serão retornadas e todas serão exclusivas. Portanto, defina a consulta como distinta e selecione apenas as colunas que constituem o seu valor 'distinto' que você deseja adicionar mais.
->select('pid','date')
para obter todos os valores únicos para um usuário em um diafonte
Você pode usar a seguinte maneira para obter os dados exclusivos de acordo com sua necessidade, como segue:
Espero que isso funcione.
fonte
Não funcionaria?
Veja aqui para discussão ..
fonte
get()
chamada executará a consulta e retornará os resultados do banco de dados e, em seguida, serácount()
executada na Coleção.Lembre-se de que agrupar por é opcional, isso deve funcionar na maioria dos casos quando você deseja que um grupo de contagem exclua valores de seleção duplicados, o addSelect é um método de instância de querybuilder.
fonte
Distinct não aceita argumentos, pois adiciona DISTINCT em sua consulta sql, no entanto, você PODE definir o nome da coluna que deseja selecionar distinto com. Portanto, se você tem
Flight->select('project_id')->distinct()->get()
é igual aSELECT DISTINCT 'project_id' FROM flights
e agora pode adicionar outros modificadores como count () ou até mesmo consultas eloquentes brutas.fonte
Com base na documentação do Laravel para consultas brutas, consegui obter a contagem de um campo de seleção para trabalhar com esse código no modelo do produto.
Esta fachada funcionou para obter o mesmo resultado no controlador:
O despejo resultante para ambas as consultas foi o seguinte:
fonte
Isso estava funcionando para mim, então tente isto: $ ad-> getcodes () -> distinto ('pid') -> contagem ()
fonte
tente isso
fonte