【问题标题】:MYSQL Select records with closest dateMYSQL 选择日期最近的记录
【发布时间】:2018-07-17 05:30:11
【问题描述】:

我的数据库中有以下 2 个表:

产品价格

CREATE TABLE `product_price` (
  `asin` varchar(10) NOT NULL,
  `date` date NOT NULL,
  `price` decimal(7,2) NOT NULL DEFAULT '0.00',
  PRIMARY KEY (`asin`,`date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

产品信息

CREATE TABLE `product_info` (
  `asin` varchar(10) NOT NULL,
  `name` varchar(200) DEFAULT NULL,
  `brand` varchar(50) DEFAULT NULL,
  `part_number` varchar(50) DEFAULT NULL,
  `url` text,
  `image` text,
  PRIMARY KEY (`asin`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

我想查找在开始日期和结束日期之间降价的产品。

我现在正在使用以下有效的查询:

$query      = "SELECT pi.*, prev.price AS 'old_price', curr.price, ROUND((100.0*(curr.price - prev.price) / prev.price),0) As PercentDiff FROM product_price As curr 
       JOIN product_price As prev ON curr.date = '".$end_date."' AND prev.date = '".$start_date."' 
       JOIN product_info pi ON curr.asin = pi.asin WHERE curr.asin = prev.asin HAVING PercentDiff < 0 ORDER BY PercentDiff";

但问题是如果价格没有变化,表product_price没有记录。

例如

asin        date         price
AAAAAAAAA  2018-07-17     7
AAAAAAAAA  2018-07-15     6

start_date="2018-07-16" end_date="2018-07-17"

我希望它在价格降低时出现在我的结果中。

我必须如何更改我的查询??

我尝试将 prev.date = '".$start_date."' 更改为 prev.date

但返回所有记录,而不是我想要的最接近的记录。

这是来自 product_price 的一些示例数据:

+------------+------------+--------+
| asin       | date       | price  |
+------------+------------+--------+
| B000GBKDB4 | 2018-07-02 |  38.66 |
| B000GBKDCI | 2018-07-02 |  72.98 |
| B000GBKFLW | 2018-07-02 |  33.27 |
| B000GBKFMG | 2018-07-02 |  63.45 |
| B000GBLZEI | 2018-07-02 |  34.90 |
| B000GBLZEI | 2018-07-04 |  21.31 |
| B000GBLZEI | 2018-07-05 |  20.24 |
| B000GBLZEI | 2018-07-06 |  18.41 |
| B000GBLZEI | 2018-07-08 |  17.49 |
| B000GBLZEI | 2018-07-09 |  15.79 |
| B000GBLZEI | 2018-07-11 |  14.84 |
| B000GBLZEI | 2018-07-16 |  14.29 |

【问题讨论】:

  • 如果你把一些样本数据和你需要的结果放在一个表格中会有所帮助
  • 我从 product_price 表中添加了一些数据。因此,在我的示例数据中,当开始日期为 2018-07-15 和 2018-07-16 时,asin B000GBLZEI 必须显示从 2018-07-11 到 2018-07-16 的价格下降但是我提供的查询只会当您设置开始日期 = 2018-07-11 和结束日期 2018-07-16 时显示
  • 价格可以在期间下跌然后回升吗?如果是这样,你想做什么?你真的是说你想要那些最后日期的价格低于开始日期的价格吗?

标签: mysql date select records closest


【解决方案1】:

仍然不是很清楚您的目标是什么,但这应该选择适用于一对日期的正确价格。 2018-07-03 到 2018-07-07 未出现在 product_price 表中。

希望这会让你走上正轨。

SELECT *,

    (SELECT price 
        FROM product_price 
        WHERE product_price.asin = product_info.asin AND 
            product_price.date <= '2018-07-03'
        ORDER BY product_price.date DESC
        LIMIT 1) AS start_price,

    (SELECT price 
        FROM product_price 
        WHERE product_price.asin = product_info.asin AND 
            product_price.date <= '2018-07-07'
        ORDER BY product_price.date DESC
        LIMIT 1) AS end_price

FROM product_info
WHERE asin = 'B000GBLZEI'

根据您的评论,您可以使用这样的临时表

CREATE TEMPORARY TABLE IF NOT EXISTS price_changes (
    asin VARCHAR(10), 
    start_price DECIMAL(7,2), 
    end_price DECIMAL(7,2));

TRUNCATE price_changes;

INSERT INTO price_changes 
SELECT asin, 

    (SELECT price 
        FROM product_price 
        WHERE product_price.asin = product_info.asin AND 
            product_price.date <= '2018-07-03'
        ORDER BY product_price.date DESC
        LIMIT 1) AS start_price,

    (SELECT price 
        FROM product_price 
        WHERE product_price.asin = product_info.asin AND 
            product_price.date <= '2018-07-07'
        ORDER BY product_price.date DESC
        LIMIT 1) AS end_price

FROM product_info;

SELECT *,
    ROUND((100.0 * (end_price - start_price) / start_price), 0) AS price_difference
FROM product_info 
    JOIN price_changes ON
        price_changes.asin = product_info.asin;

【讨论】:

  • 在正确的方向上确定这一点。但我需要在此之上计算差异(百分比)。
  • 我添加了一些代码来计算百分比差异。
  • 实现它似乎有点复杂,但我想没有其他选择。我会尝试并让你知道。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多