首页 > 解决方案 > 使用 PHP 在 MySQL 中通过子查询获取原始价格和当前价格

问题描述

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

我需要获取所有广告的列表,以及每个广告的第一个注册价格,以及最后一个. 我在同一个价格表上使用了双子查询。

ads

IDint 广告标题varchar
1 土豆
2 番茄

prices

IDint 价格decimal 价格时间戳timestamp ads_idint
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 servidor local (XAMPP):

广告标题 price_first 价格_当前
土豆 50 5
番茄 1000 700

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

我需要的?

我需要了解问题是否出在这些提供程序的服务器配置中,或者查询是否错误。

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

标签: phpmysqlsubquerysql-order-byionos

解决方案


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

    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

推荐阅读