Eu quero fazer algo assim:
SELECT *
FROM db.table
WHERE COUNT(someField) > 1
Como posso fazer isso no MySql?
Use a cláusula HAVING
, not WHERE
, para comparação de resultados agregados.
Tomando a consulta pelo valor de face:
SELECT *
FROM db.table
HAVING COUNT(someField) > 1
Idealmente, deve haver um GROUP BY
definido para a avaliação adequada na HAVING
cláusula, mas o MySQL não permite colunas ocultas do GROUP BY ...
Isso está em preparação para uma restrição exclusiva someField
? Parece que deveria ser ...
GROUP BY
certeza (a menos que seja alguma coisa não padrão do MySQL)?someField
valores não nulos ou um conjunto de resultados vazio se não contiver .fonte
Você também pode fazer isso com uma autojunção:
fonte
Aqui está:
fonte
Mão única
fonte
Como OMG Ponies afirmou, a cláusula de ter é o que você está depois. No entanto, se você esperava obter linhas discretas em vez de um resumo (o "ter" cria um resumo) - isso não pode ser feito em uma única instrução. Você deve usar duas instruções nesse caso.
fonte
Dou um exemplo no Group By entre duas tabelas no Sql:
Select cn.name,ct.name,count(ct.id) totalcity from city ct left join country cn on ct.countryid = cn.id Group By cn.name,ct.name Having totalcity > 2
fonte
Para mim, não ter um grupo por apenas retornou resultado vazio. Então eu acho que ter um grupo para a declaração de ter é muito importante
fonte
Também deve ser mencionado que o "pk" deve ser um campo chave. A auto-adesão
por Bill Karwin dar-lhe todos os registros que são duplicados que é o que eu queria. Como alguns têm mais de dois, você pode obter o mesmo registro mais de uma vez. Eu escrevi tudo em outra tabela com os mesmos campos para me livrar dos mesmos registros por supressão de campos-chave. eu tentei
SELECT * FROM db.table HAVING COUNT(someField) > 1
acima primeiro. Os dados retornados fornecem apenas uma das duplicatas, menos da metade do que isso fornece, mas a contagem é boa se isso for tudo o que você deseja.
fonte