Subquery o una doppia interrogazione?
Domanda
Per un client ho costruito un sito web travelagency. Ora mi hanno chiesto di ottimizzare e automatizzare alcune cose. Una di queste cose è che le strutture indicate nella searchlist devono essere prenotabili.
semplificata questa è la struttura
Ho un AccommodationObject, un alloggio dispone di 1 o più PricePeriods.
Quello che ho bisogno di fare scegliere l'ultimo priceperiod collegato ad un dato alloggio. Il priceperiod ha un campo 'date_until', che è un timestamp. Nella query un controllo deve essere effettuato, timestamp corrente deve essere inferiore l'ultimo timestamp da una priceperiod.
Questo è facile da fare con una seconda query, che ottiene solo l'ultimo timestamp dalla tabella priceperiod da tutte le priceperiod-file collegati alla struttura data.
Mi chiedo se questo è il caso migliore, o se devo usare una sottoquery per questo. E se sì, come sarebbe una query come questo look? Non ho molta esperienza con sottoquery.
Aggiorna
Tavolo struttura (semplice)
Alloggio -> ID
PricePeriod -> ID | AccommodationID | DateUntil
semplificata:
SELECT fieldlist FROM Accommodation WHERE ID = $id
SELECT MAX(DateUntil) FROM PricePeriod WHERE AccommodationID = $id
Ma vorrei a questo in una query. Spero che sia chiaro questo modo ..
Soluzione
E 'dipende da una serie di cose, ma ciò che si dovrebbe fare è cercare un paio di diverse alternative.
Personalmente, vorrei fare:
SELECT fieldlist,
(SELECT MAX(DateUntil) FROM PricePeriod) WHERE AccomidationID = a.id) AS last_date
FROM Accommodation AS a
WHERE a.id = $id
Si potrebbe anche fare (Ma non può essere il più efficiente) ...:
SELECT fieldlist, MAX(b.DateUntil)
FROM Accommodation AS a
JOIN PricePeriod AS b ON a.id = b.AccommodationID
WHERE a.id = $id
GROUP BY a.id
La cosa più grande è quello di provarli tutti (assicurarsi di utilizzare SQL_NO_CACHE
modo che i risultati sono vere ogni volta). eseguirli attraverso EXPLAIN
per provare a vedere come "pesanti" sono ...