Domanda

Ho una tabella che ha tre campi (item_id, fonte, e di prezzo). (Item_id, fonte, e prezzo) insieme costituiscono la chiave primaria.

item_id    source      price
-------    -------     -----
1          paris       13
1          london      12
1          newyork     15
2          paris       22
2          london      15
2          newyork     14

Per ogni item_id, voglio sapere il posto più economico per farlo, e il prezzo che ho pagherà in quel luogo. Per l'esempio di cui sopra, mi piacerebbe vedere il seguente output:

item_id    source     price
-------    -------    ---------
1          london     12
2          newyork    14

C'è un modo semplice per fare questo senza menzionare il nome della tabella due volte? Sto utilizzando MySQL, quindi non posso usare una clausola WITH.

Ho preso uno sguardo alla soluzione a due-query uniti in questione di un altro utente ( record correlati gruppo, ma raccolgono determinati campi da solo il primo record ), ma mi piacerebbe davvero evitare di menzionare il tavolo due volte. Il problema è che la semplice tabella in questa domanda in realtà rappresenta una vista in linea nel mio vero problema che dura circa 5 secondi per creare per ogni uso, in modo spero di trovare alternative.

È stato utile?

Soluzione

Ecco un modo, utilizzando un join interno per filtrare le righe con il prezzo più basso:

select i.* 
from items i
inner join (
    select item_id, min(price) as minprice
    from items 
    group by item_id
) cheapest on i.price = cheapest.minprice
    and i.item_id = cheapest.item_id

Se ci sono più fonti con il prezzo più basso, saranno tutti visualizzati.

EDIT:. Dal momento che la tua domanda menziona le voci vista abbraccia a lungo per costruire, è possibile memorizzare il risultato in una tabella temporanea

create temporary table temp_items 
as 
select item_id, source, price from YourView

E quindi eseguire la query di raggruppamento sulla tabella temporanea. In MySQL, una tabella temporanea è visibile solo per la connessione corrente, e si elimina automaticamente quando la connessione è chiusa.

Altri suggerimenti

io purtroppo non lo so dati MySQL e conversione di stringa a memoria. Ma ecco qualcosa che se si massaggiò un po 'per la sintassi corretta potrebbe sorprendervi:

SELECT
   item_id,
   source = Convert(varchar(30), Substring(packed, 5, 30)),
   price = Convert(int, Substring(packed, 1, 4))
FROM
   (
      SELECT
         item_id,
         Min(Convert(binary(4), price) + Convert(varbinary(30), source) AS packed
      FROM items
      GROUP BY item_id
   ) X

Questo è sicuramente un hack. E 'sicuramente non deve essere utilizzato in tutti i casi. Ma quando le prestazioni sono critiche, a volte ne vale la pena.

questa discussione per maggiori informazioni.

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