MySQL GroupWise Max dalla lunghezza di un campo
-
11-12-2019 - |
Domanda
Tabella Product
:
id: int
name: varchar(255)
info: varchar(8000)
.
Ho bisogno di ottenere un elenco di tutti i prodotti, raggruppati per nome e se alcuni prodotti hanno lo stesso nome, allora quello con il maggior numero di dati nel campo info
deve essere scelto per mostrare.Un altro requisito è la coerenza - gli stessi prodotti dovrebbero essere garantiti per essere visualizzati ogni volta.Ma le prestazioni non sono affatto la mia preoccupazione con questo.
Quindi il meglio che ho inventato finora è questo:
select * from (select * from product order by length(info) desc) as product group by name
.
La mia comprensione che questo dovrebbe funziona in mysql ma non garantisce i risultati.
C'è un modo migliore?
Aggiornamento:
Un esempio di ciò che sto cercando.Se i dati sono
.
1, 'Product1', '12345'
2, 'Product1', '123'
3, 'Product2', '123456'
4, 'Product2', '123456'
5, 'Product2', '12'
I risultati attesi dovrebbero essere:
.
1, 'Product1', '12345'
3, 'Product2', '123456'
o
.
1, 'Product1', '12345'
4, 'Product2', '123456'
Non mi interessa quale dei due finché è lo stesso risultato ogni volta che eseguo la query.
Soluzione
Penso che tu abbia bisogno di fare un join:
select p.*
from product p join
(select p.name, max(len(info)) as maxinfolen
from product p
group by p.name
) t
on p.name = t.name and
len(p.info) = t.maxinfolen
.
Ciò restituirà i duplicati, se la lunghezza massima viene ripetuta nelle informazioni.Per eliminare i duplicati, è possibile raggruppare all'esterno:
select p.name, max(info)
from product p join
(select p.name, max(len(info)) as maxinfolen
from product p
group by p.name
) t
on p.name = t.name and
len(p.info) = t.maxinfolen
group by p.name
.
Se stai cercando di scegliere lo stesso ID ogni volta, puoi usare la stessa idea:
select p.*
from product p join
(select p.name, min(id) as minid
from product p join
(select p.name, max(len(info)) as maxinfolen
from product p
group by p.name
) t
on p.name = t.name and
len(p.info) = t.maxinfolen
group by p.name
) t
on p.name = t.name and
p.id = t.minid
.