Mysql
 sql >> Database >  >> RDS >> Mysql

Come posso fare due condizioni nell'avere una clausola

Come documentato in SELECT Sintassi:

In altre parole, viene applicato dopo l'operazione di raggruppamento è stata eseguita (in contrasto con WHERE , che viene eseguito prima qualsiasi operazione di raggruppamento). Vedi WHERE vs HAVING .

Pertanto, la tua query corrente forma prima il set di risultati da quanto segue:

SELECT   COUNT(domain) AS `sum domains`, file
FROM     `table`
GROUP BY Number

Guardalo su sqlfiddle :

| SUM DOMAINS |      FILE |
---------------------------
|           2 | aaa.com_1 |
|           2 | bbb.com_1 |
|           1 | eee.com_1 |

Come puoi vedere, i valori selezionati per il file sono semplicemente uno dei valori di ciascun gruppo, come documentato in MySQL Estensioni a GROUP BY :

La tua query attuale procede quindi a filtrare questi risultati in base al tuo HAVING clausola:

HAVING   COUNT(Number) > 1 AND file LIKE '%\_1'

Con i valori di file selezionato sopra, ogni singolo girone corrisponde al secondo criterio; e i primi due gironi corrispondono al primo criterio. Pertanto i risultati della la query completa sono:

| SUM DOMAINS |      FILE |
---------------------------
|           2 | aaa.com_1 |
|           2 | bbb.com_1 |

Dopo i tuoi commenti sopra , vuoi filtrare i record su file prima raggruppamento e quindi filtrare i gruppi risultanti per quelli contenenti più di una corrispondenza. Quindi usa WHERE e HAVING rispettivamente (e seleziona Number invece di file per identificare ogni gruppo):

SELECT   Number, COUNT(*) AS `sum domains`
FROM     `table`
WHERE    file LIKE '%\_1'
GROUP BY Number
HAVING   `sum domains` > 1

Guardalo su sqlfiddle :

| NUMBER | SUM DOMAINS |
------------------------
|    222 |           2 |