【发布时间】:2010-02-14 16:32:41
【问题描述】:
我有一个将历史价格信息拼凑在一起的 SQL 查询。它不是特别干净,可能会进行很多优化。原因之一是我使用子查询通过子查询获取“上一个”价格值并将其分配给别名“last_value”。理想情况下,我希望能够在查询 WHERE 子句中使用此别名,而不必重新执行查找。
我理解为什么这是不可能的(据我所知,SQL 查询是从右到左解析的,在数据被传回之前应用了别名)。我只是想在这里发帖询问是否可以使用其他方式来实现这样的事情。
具体来说,我很想通过 SQL 计算 p.value (当前值)和 last_value (最后一个值)之间的百分比差异,而不是必须在应用程序层进行计算。
我曾考虑将百分比差异作为单独的列存储在表本身中,但这似乎有点倒退(考虑到所涉及的逻辑微不足道,唯一的绊脚石是别名的使用)。
我正在使用 MySQL。
$sql = "SELECT
t.*,
p.value,
p.timestamp,
(SELECT
value
FROM
prices
WHERE
prices.id = p.id AND
prices.country=':country' AND
prices.timestamp < p.timestamp
ORDER BY
prices.timestamp DESC
LIMIT 1) AS last_value
FROM
prices AS p,
titles AS t
WHERE
t.row_id = p.id AND
p.country = ':country' AND
p.current = 1 AND
(SELECT
value
FROM
prices
WHERE
prices.id = p.id AND
prices.country=':country' AND
prices.timestamp < p.timestamp
ORDER BY
prices.timestamp DESC
LIMIT 1) IS NOT NULL
ORDER BY
p.timestamp DESC
LIMIT :offset, :limit";
【问题讨论】:
-
哪个 DBMS?每个人的答案都会大不相同。
-
对不起,应该指定。 MySQL。