首页 > 解决方案 > 在两个日期之间加入 MAX id

问题描述

我遇到了这个加入的问题。基本上我只需要知道两个表上是否存在“仓库”,但只需在两个日期之间获取所需“仓库”的最后一个条目。

Select c.warehouse, p.id, p.status FROM control c LEFT JOIN payment p ON c.warehouse = p.warehouse WHERE p.date BETWEEN '2018-06-26' AND '2018-06-27'

我也试过(它说:无效使用组功能):

Select c.warehouse, p.id, p.status FROM control c LEFT JOIN payment p ON c.warehouse = p.warehouse WHERE p.date BETWEEN '2018-06-26' AND '2018-06-27' && p.id = MAX(p.id)

这些是我的桌子:

                              payments                       control
             +---------------------------------------+    +-----------+
             | id  |  warehouse  | status |   date   |    | warehouse |
             +---------------------------------------+    +-----------+
             |19006|    226975   |   DUE  |2018-06-26|    |   226975  |
    MAX ID-> |19066|    226975   |   PAID |2018-06-27|    |   226976  |
             +---------------------------------------+    +-----------+

获得的结果:

+--------------------------------------+
| warehouse |  id  | status |   date   |
+--------------------------------------+
|  226975   |19006 |  DUE   |2018-06-26|
+--------------------------------------+

在这种情况下,我获得了“第一个条目”,较低的条目(id:19006),我想要“最后一个”(id:19066)的最大值。

预期结果:

+--------------------------------------+
| warehouse |  id  | status |   date   |
+--------------------------------------+
|  226975   |19066 |  PAID  |2018-06-27|
+--------------------------------------+

有任何想法吗?

标签: mysqljoinselectleft-join

解决方案


两个要求。

  1. warehouse在两个表中的行。排除其他人。这是通过内部 JOIN 完成的。
  2. 表中的最新条目payments。可以使用此子查询检索每个id最新条目的。warehouse

      SELECT MAX(id) id, warehouse 
        FROM payments
       GROUP BY warehouse
    

把它们放在一起:

  SELECT p.warehouse, p.id, p.status, p.date
    FROM payments p
    JOIN ( SELECT MAX(id) id, warehouse 
             FROM payments
            GROUP BY warehouse
         ) mm ON p.id = mm.id AND p.warehouse = mm.warehouse
    JOIN control c ON p.warehouse = c.warehouse

推荐阅读