在 MySQL 和 PHP 中通过子查询获取原始价格和当前价格

Get original and current prices with a subquery in MySQL with PHP

我有 table 个 广告 和另一个 价格 ,与这些广告相关。当用户在应用程序中修改价格时,价格会添加一个新行 table,其中包括价格和修改价格的日期。

我需要获取包含所有广告的列表,并且对于每个广告,注册的第一个价格也是最后一个。我以相同的价格使用了双重子查询 table.

表格

ads

id int ad_title varchar
1 Potatoes
2 Tomatoes

prices

id int price decimal price_timestamp timestamp ads_id int
1 50 2021-02-16 21:12:36 1
2 5 2021-02-17 21:12:48 1
3 1000 2021-02-17 21:20:40 2
4 900 2021-02-18 13:20:49 2
5 700 2021-02-18 13:20:49 2

查询

    SELECT ads.ad_title, prices_firsts.price AS price_first, prices_currents.price AS price_current
    FROM ads
    LEFT JOIN (
        SELECT *
        FROM prices
        GROUP BY id
        ORDER BY price_timestamp ASC
    ) prices_firsts ON prices_firsts.ads_id = ads.id
    LEFT JOIN (
        SELECT *
        FROM prices
        GROUP BY id
        ORDER BY price_timestamp DESC
    ) prices_currents ON prices_currents.ads_id = ads.id
    GROUP BY ads.id

Esta consulta devuelve lo siguiente en mi 本地服务 (XAMPP):

ad_title price_first price_current
Potatoes 50 5
Tomatoes 1000 700

如您所见,查询结果是正确的 但是 当它在来自外部提供商的服务器上执行时(我已在 1&1 IONOS 和 Arsys Spain 对其进行了测试)每次执行的结果实际上都不同。有时价格会以相反的顺序出现,有时会在两列中出现相同的价格...

我需要什么?

我需要了解问题是出在这些提供商的服务器配置上还是查询有误。

我也乐于接受您可以通过其他方式获取价格(第一和当前)的想法,即使它是数据库中的另一个结构。

您也可以尝试对最小和最大日期使用子查询

    select ads.id, p1.price min_price, p2.price max_price,
from ads 
inner join (

    select  ads_id, min(price_timestamp ) min_date, max(price_timestamp )  max_date 
    from prices 
    group by ads_id

 ) t on t.ads_id = ads.id 
 INNER JOIN prices p1 on p1.ads_id = ads.id and p1.price_timestamp = t.min_date
 INNER JOIN prices p2 on p2.ads_id = ads.id and p2.price_timestamp = t.mmaxn_date