我有两张桌子,我正试图从中获取数据。第一个是'标题'表,它表示产品信息(名称,唯一ID等)。第二个是“价格”表,它收集各种货币的价格信息(每个产品在价格表中可以有多个历史条目)。
我写了一篇相当冗长的SQL语句来获取产品的最新价格变化,但有一些问题希望更有经验的用户能够帮助我:
SELECT
t.id,
t.name,
t.type,
p.value,
(SELECT
value
FROM
prices
WHERE
prices.id = p.id AND
prices.country='US' AND
prices.timestamp < p.timestamp
ORDER BY
prices.timestamp DESC
LIMIT 1) AS last_value
FROM
prices AS p
INNER JOIN
titles AS t
ON
t.row_id = p.id
WHERE
p.country = 'US' AND
(SELECT
value
FROM
prices
WHERE
prices.id = p.id AND
prices.country='US' AND
prices.timestamp < p.timestamp
ORDER BY
prices.timestamp DESC
LIMIT 1) IS NOT NULL
GROUP BY
t.id
ORDER BY
p.timestamp DESC,
last_value DESC
LIMIT 0, 25"
我遇到的第一个问题是,虽然此查询有效,但标题会在同一个列表中多次出现。虽然这是预期的,但我理想情况下只需要为标题显示最新的价格变化。为了解决这个问题,我尝试使用标题'id'进行GROUPING(注意:上面的GROUP BY t.id)。不幸的是,虽然我希望GROUP尊重ORDER BY(订购DESC订单中的最新价格变化),结果似乎会删除最新的更改,并显示具有较早价格值的GROUP'd标题。
其次,有没有更好的方法来获取每个项目的最后价格(目前我抓住当前值,然后运行子查询来获取'last_value' - 它实际上代表当前价格变化之前的值)。目前我运行两个子查询:一个用于获取第二个到最后一个已知价格,另一个用于确保数据库中存在先前价格(否则将标题列为价格变化没有意义)。
任何帮助将不胜感激!
答案 0 :(得分:0)
这个怎么样:
SELECT titles.id, titles.name, titles.type, prices.value, MAX(prices.timestamp)
FROM titles, prices
WHERE prices.row_id = titles.id AND prices.country='US';
请注意,我没有安装MySQL,所以我无法尝试此查询。
[编辑:]我认为它不起作用'因为它将始终显示为所有项目输入的最后价格,因为它总是从价格表中选择最高时间戳,也许一群人会这样做,我现在真的很困,我不能直接思考;
[编辑2:]这个怎么样: (SELECT max(report_run_date)as maxdate,report_name 来自report_history GROUP BY report_name)maxresults
SELECT titles.id, titles.name, titles.type, prices.value,
(SELECT MAX(prices.timestamp) as maxtimestamp FROM prices GROUP BY prices.row_id)
FROM titles, prices
WHERE prices.row_id = titles.id AND prices.country='US';