Tenho o seguinte código SQL:
SELECT widgets.campaign_name, widgets.enddate, widgets.active,
widgets.id_widget,COUNT(*) AS entries
FROM widgets
LEFT JOIN entries ON widgets.id_widget = entries.id_widget
WHERE widgets.active IN ( 0 )
AND id_user = 8
GROUP BY widgets.campaign_name
Ele faz exatamente o que eu quero fazer além de uma coisa. Se eu tiver 0 entradas em uma campanha, ela ainda mostrará 1 entrada. Quero me livrar desse problema e fazer com que conte exatamente quantas entradas existem. Se 0, deve exibir 0.
O código acima funciona bem para 1,2....n entradas.
O problema é que as junções externas produzem
NULL
valores nas colunas da tabela (à direita) para as linhas da tabela à esquerda que não têm correspondência. Portanto, você deve usarCOUNT(entries.id_widget)
which counts not null values nessa coluna e notCOUNT(*)
which counts rows.Mais algumas notas:
widget.id_user
) ou alias (w.id_user
). Caso contrário, a consulta será interrompida se uma coluna com o mesmo nome for adicionada posteriormente na tabelaentries
.campaign_name
seja a chave primáriawidgets
ou tenha uma restrição exclusiva, você não deve usarGROUP BY
esse método. Todas as colunas daSELECT
lista devem ser usadas em funções agregadas ou aparecer naGROUP BY
lista. O MySQL não faz tal verificação e resultados indeterminados podem ser retornados por consultas que não seguem esta regra.Se as colunas (em
SELECT
) dependerem das colunas emGROUP BY
(e isso seria verdade neste caso secampaign_name
houvesse uma restrição única), essa é uma exceção que os resultados serão determinados e você pode usar esse "recurso" do MySQL. Você também deve verificar se aONLY_FULL_GROUP_BY
configuração está desativada se quiser usá-la.Para mais detalhes, leia a documentação do MySQL: MySQL Extensions to GROUP BYe as discussões aqui: Por que o MySQL adiciona um recurso que entra em conflito com os padrões SQL? .
A consulta torna-se: