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.

È stato utile?

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
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top