子查询还是双查询?

时间:2010-08-19 09:35:43

标签: mysql subquery querying

对于客户,我建立了一个travelagency网站。现在他们让我优化并自动化一些东西。其中一个原因是搜索列表中显示的住宿必须是可预订的。

简化了这是结构

我有一个AccommodationObject,一个住宿有一个或多个PricePeriods。

我需要做的是选择与给定住宿相关的最后一个价格期间。 priceperiod有一个字段'date_until',这是一个时间戳。在查询中必须进行检查,当前时间戳必须小于来自priceperiod的最后一个时间戳。

使用第二个查询很容易做到这一点,该查询只是从连接到给定住宿的所有priceperiod行的priceperiod表中获取最后一个时间戳。

我想知道这是否是最好的情况,或者我是否应该使用子查询。如果是这样,这样的查询怎么样?我对子查询没有多少经验。

更新

表结构(简单)

住宿 - > ID

PricePeriod - > ID |住宿ID | DateUntil

简化为:

SELECT fieldlist FROM Accommodation WHERE ID = $id
SELECT MAX(DateUntil) FROM PricePeriod WHERE AccommodationID = $id

但我想在一个查询中这样做。我希望这样清楚......

1 个答案:

答案 0 :(得分:2)

这取决于许多事情,但你应该做的是尝试一些不同的选择。

就个人而言,我会这样做:

SELECT fieldlist, 
(SELECT MAX(DateUntil) FROM PricePeriod) WHERE AccomidationID = a.id) AS last_date
FROM Accommodation AS a
WHERE a.id = $id

你也可以这样做(但可能效率不高)......:

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

最重要的是全部尝试(请务必使用SQL_NO_CACHE,以便每次都能得到结果)。通过EXPLAIN运行它们,试着看看它们有多“重”......