【问题标题】:Subquery or a double query?子查询还是双重查询?
【发布时间】:2011-04-01 00:44:27
【问题描述】:

我为一个客户建立了一个旅行社网站。现在他们要求我优化和自动化一些事情。其中之一是搜索列表中显示的住宿必须是可预订的。

简化了这个结构

我有一个 AccommodationObject,一个 Accommodation 有 1 个或多个 PricePeriods。

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

这很容易通过第二个查询来完成,它只是从连接到给定住宿的所有 priceperiod 行中的 priceperiod 表中获取最后一个时间戳。

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

更新

表结构(简单)

住宿->身份证

PricePeriod -> ID |住宿ID |截止日期

简化:

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

但我想在一个查询中解决这个问题。我希望这样清楚..

【问题讨论】:

  • 如果您发布表结构以及您自己尝试过的查询会有所帮助。

标签: mysql subquery querying


【解决方案1】:

这取决于很多事情,但您应该尝试几种不同的选择。

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

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 运行它们以尝试查看它们有多“重”...

【讨论】:

  • 感谢您的回复,我现在就试试您的建议!
  • 谢谢,经过一些尝试,我接近了一个可行的解决方案,通过对我问过的另一个问题提供的答案,我现在已经开始工作了。 +1 +接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 2011-06-05
  • 2012-09-17
  • 1970-01-01
相关资源
最近更新 更多