在记录列表中选择最近的日期,但小于今天的日期
Posted
技术标签:
【中文标题】在记录列表中选择最近的日期,但小于今天的日期【英文标题】:Select the most recent Date, but smaller than today's date in a record list 【发布时间】:2011-07-18 20:34:37 【问题描述】:grade_id
grade_name
price
update_date.
给定等级有多个记录,具有不同的日期和价格...:
grade_id grade_name price update_date (y-m-d)
1 A 8$ 2011-02-01
1 A 10$ 2011-03-01
1 A 20$ 2011-04-01
2 B 10$ 2011-02-01
2 B 20$ 2011-03-01
2 B 30$ 2011-04-01
如何通过选择查询获得最近更新的价格(但在过去).. 得到:
1 A 10$ 2011-03-01
2 B 20$ 2011-03-01
结果......(因为最近的价格,过去的日期......
谢谢 大卫
【问题讨论】:
【参考方案1】: SELECT t1.grade_id, t1.grade_name, t1.price, t1.update_date
FROM my_tbl t1
LEFT JOIN my_tbl t2 on t2.grade_id = t1.grade_id
AND t2.update_date > t1.update_date
AND t2.update_date < CURRENT_DATE
WHERE t1.update_date < CURRENT_DATE
AND t2.grade_id IS NULL
ORDER BY t1.grade_name
【讨论】:
【参考方案2】:对于大量记录而言,这不是最快的解决方案,而是一种可读的解决方案。
select *
from table t1
where update_date =
(select max(update_date)
from table t2
where t2.grade_id = t1.grade_id
and t2.update_date < current_date);
InnoDB 表上 (grade_id, update_date) 上的主键有帮助。
【讨论】:
【参考方案3】:root@natasha:test> CREATE TABLE t (grade_id INT UNSIGNED NOT NULL, grade_name CHAR(1) NOT NULL, price CHAR(3) NOT NULL, update_date DATE);
Query OK, 0 rows affected (0.10 sec)
root@natasha:test> INSERT INTO t VALUES (1, 'A', '8$', '2011-02-01'), (1, 'A', '10$', '2011-03-01'), (1, 'A', '20$', '2011-04-01'), (2, 'B', '10$', '2011-02-01'), (2, 'B', '20$', '2011-03-01'), (2, 'B', '30$', '2011-04-01');
Query OK, 6 rows affected (0.13 sec)
Records: 6 Duplicates: 0 Warnings: 0
root@natasha:test> SELECT * FROM t;
+----------+------------+-------+-------------+
| grade_id | grade_name | price | update_date |
+----------+------------+-------+-------------+
| 1 | A | 8$ | 2011-02-01 |
| 1 | A | 10$ | 2011-03-01 |
| 1 | A | 20$ | 2011-04-01 |
| 2 | B | 10$ | 2011-02-01 |
| 2 | B | 20$ | 2011-03-01 |
| 2 | B | 30$ | 2011-04-01 |
+----------+------------+-------+-------------+
6 rows in set (0.00 sec)
root@natasha:test> SELECT * FROM (SELECT * FROM t WHERE update_date < DATE(NOW()) ORDER BY update_date DESC) AS `t` GROUP BY grade_id;
+----------+------------+-------+-------------+
| grade_id | grade_name | price | update_date |
+----------+------------+-------+-------------+
| 1 | A | 10$ | 2011-03-01 |
| 2 | B | 20$ | 2011-03-01 |
+----------+------------+-------+-------------+
2 rows in set (0.00 sec)
【讨论】:
【参考方案4】:select t1.* from table as t1
inner join (
select grade_id,max(update_date) as update_date
from table where update_date < curdate() group by grade_id ) as t2
on t1.grade_id = t2.grade_id and t1.update_date = t2.update_date
在 (grade_id,update_date) 向表添加索引
【讨论】:
【参考方案5】:SELECT MAX(update_date) FROM table WHERE DATE(update_date) != DATE(NOW());
【讨论】:
以上是关于在记录列表中选择最近的日期,但小于今天的日期的主要内容,如果未能解决你的问题,请参考以下文章