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

Come scrivere la più grande n per query di tipo gruppo, ma con condizioni aggiuntive?

Ciò richiede una certa attenzione su dove mettere la condizione (in where o su on ?) in modo da non farti ingannare :-) Devi aggiungere la condizione per t1 a where clausola e per t2 su on clausola:

SELECT t1.type, t1.name, t1.value
FROM mytable t1
LEFT JOIN mytable t2 ON t1.type = t2.type AND t1.value > t2.value 
    AND t2.popularity > 3 /* here */
WHERE t2.value IS NULL 
    AND t1.popularity > 3 /* and here */

Non l'ho testato, ma dovrebbe funzionare.

Tentativo di spiegazione: la condizione in cui la clausola influisce sugli elementi che consideri come potenziali elementi con il valore più basso. Considerando che la condizione in on clausola influisce sul collegamento:con quali altri elementi vuoi confrontarlo? Definisce il gruppo all'interno del quale confrontare. Tecnicamente, ha un impatto su quando t2.* sarà NULL. Avevi fornito la condizione su t2.popularity a where clausola invece, non riceverai alcun NULL (cioè non troverai elementi con il valore più basso) per i gruppi in cui gli elementi più bassi hanno una bassa popolarità.