【问题标题】: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

结果......(因为最近的价格,过去的日期......

谢谢 大卫

【问题讨论】:

    标签: mysql select max


    【解决方案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());
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多