mysql选择日期最近的记录

zbdgwd5y  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(480)

我的数据库中有以下两个表:
产品价格

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

产品信息

  1. CREATE TABLE `product_info` (
  2. `asin` varchar(10) NOT NULL,
  3. `name` varchar(200) DEFAULT NULL,
  4. `brand` varchar(50) DEFAULT NULL,
  5. `part_number` varchar(50) DEFAULT NULL,
  6. `url` text,
  7. `image` text,
  8. PRIMARY KEY (`asin`)
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8

我想找出在开始日期和结束日期之间降价的产品。
我现在正在使用以下有效的查询:

  1. $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
  2. JOIN product_price As prev ON curr.date = '".$end_date."' AND prev.date = '".$start_date."'
  3. JOIN product_info pi ON curr.asin = pi.asin WHERE curr.asin = prev.asin HAVING PercentDiff < 0 ORDER BY PercentDiff";

但问题是,如果价格没有变化,表格产品价格就没有记录。
例如

  1. asin date price
  2. AAAAAAAAA 2018-07-17 7
  3. AAAAAAAAA 2018-07-15 6

开始日期=“2018-07-16”结束日期=“2018-07-17”
我希望它在我的结果,因为价格降低了。
我怎么改变我的问题??
我试图将prev.date='“$start\u date.”更改为prev.date<='“$start\u date.”
但是返回所有的记录,而不是我想要的最接近的记录。
以下是产品价格的一些样本数据:

  1. +------------+------------+--------+
  2. | asin | date | price |
  3. +------------+------------+--------+
  4. | B000GBKDB4 | 2018-07-02 | 38.66 |
  5. | B000GBKDCI | 2018-07-02 | 72.98 |
  6. | B000GBKFLW | 2018-07-02 | 33.27 |
  7. | B000GBKFMG | 2018-07-02 | 63.45 |
  8. | B000GBLZEI | 2018-07-02 | 34.90 |
  9. | B000GBLZEI | 2018-07-04 | 21.31 |
  10. | B000GBLZEI | 2018-07-05 | 20.24 |
  11. | B000GBLZEI | 2018-07-06 | 18.41 |
  12. | B000GBLZEI | 2018-07-08 | 17.49 |
  13. | B000GBLZEI | 2018-07-09 | 15.79 |
  14. | B000GBLZEI | 2018-07-11 | 14.84 |
  15. | B000GBLZEI | 2018-07-16 | 14.29 |
a5g8bdjr

a5g8bdjr1#

仍然不是很清楚你在追求什么,但这应该选择正确的价格适用于一对日期。2018-07-03至2018-07-07未出现在产品价格表中。
希望这能让你走上正轨。

  1. SELECT *,
  2. (SELECT price
  3. FROM product_price
  4. WHERE product_price.asin = product_info.asin AND
  5. product_price.date <= '2018-07-03'
  6. ORDER BY product_price.date DESC
  7. LIMIT 1) AS start_price,
  8. (SELECT price
  9. FROM product_price
  10. WHERE product_price.asin = product_info.asin AND
  11. product_price.date <= '2018-07-07'
  12. ORDER BY product_price.date DESC
  13. LIMIT 1) AS end_price
  14. FROM product_info
  15. WHERE asin = 'B000GBLZEI'

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

  1. CREATE TEMPORARY TABLE IF NOT EXISTS price_changes (
  2. asin VARCHAR(10),
  3. start_price DECIMAL(7,2),
  4. end_price DECIMAL(7,2));
  5. TRUNCATE price_changes;
  6. INSERT INTO price_changes
  7. SELECT asin,
  8. (SELECT price
  9. FROM product_price
  10. WHERE product_price.asin = product_info.asin AND
  11. product_price.date <= '2018-07-03'
  12. ORDER BY product_price.date DESC
  13. LIMIT 1) AS start_price,
  14. (SELECT price
  15. FROM product_price
  16. WHERE product_price.asin = product_info.asin AND
  17. product_price.date <= '2018-07-07'
  18. ORDER BY product_price.date DESC
  19. LIMIT 1) AS end_price
  20. FROM product_info;
  21. SELECT *,
  22. ROUND((100.0 * (end_price - start_price) / start_price), 0) AS price_difference
  23. FROM product_info
  24. JOIN price_changes ON
  25. price_changes.asin = product_info.asin;
展开查看全部

相关问题