1

假设有包含以下数据的表:

|id|product_id|date_time          |warehouse_id|city_id|
+--+----------+-------------------+------------+-------+
| 1|         1|2013-08-09 10:52:28|           1|      1|
| 2|         1|2013-08-09 10:52:28|           1|      2|
| 3|         1|2013-08-09 10:52:29|           1|      3|
| 4|         2|2013-08-09 10:52:28|           1|      1|
| 5|         2|2013-08-09 10:52:28|           1|      2|
+--+----------+-------------------+------------+-------+

在 mySQL JOIN 查询中是否有任何方法可以让每个 product_id 和warehouse_id 仅获得一个条目(最新的日期时间)

IE:

SELECT * FROM xxxxx
JOIN a ON a.product_id=xxxx.product_id AND a.warehouse_id=xxxx.warehouse_id

我尝试在 JOIN 上使用 max(date_time) 但这当然不会给我正确的结果集

select * from xxxxx x 
JOIN a ON a.product_id=x.product_id and a.warehouse_id=x.warehouse_id
JOIN (SELECT id, max(date_time) as date_time From a  group by a.product_id, a.warehouse ) a2 on a2.id=a.id
4

1 回答 1

3

仅仅因为您要求最大日期并不意味着id来自该行。MySQL 选择任意一个,id因为该列不在聚合函数中,也不在group by子句中。将id来自具有最大值的行是 MySQL 中的一个常见误解。这种语法在其他数据库中通常是不允许的(您的查询不是标准 SQL)。

你需要做两件事。首先,您需要在product_idand上进行连接warehouse_id,因为这些是您尝试获取最大日期的字段。其次,您需要date_timeon子句中包含:

select *
from xxxxx x 
JOIN a ON a.product_id=x.product_id and a.warehouse_id=x.warehouse_id
JOIN (SELECT product_id, a.warehouse_id, max(date_time) as date_time
      From a 
      group by a.product_id, a.warehouse_id
     ) a2
    on a2.product_id = a.product_id and a2.warehouse_id = a.warehouse_id and
       a2.date_time = a.date_time;

编辑:

如果你想在 上加入id,你可以使用这个技巧:

select *
from xxxxx x 
JOIN a ON a.product_id=x.product_id and a.warehouse_id=x.warehouse_id
JOIN (SELECT substring_index(group_concat(id order by date_time desc), ',', 1) as id
      From a
      group by a.product_id, a.warehouse_id
     )  a2
     on a2.id=a.id;

但是请注意,这会强制id子查询中的类型为字符串,即使它最初是数字。

于 2013-08-09T11:32:43.033 回答