在 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
我有 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