假设让表包含以下数据:
|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(最新的date_time)
即:
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
答案 0 :(得分:3)
仅仅因为您要求的最长日期并不意味着id
来自该行。 MySQL选择任意id
,因为该列不在聚合函数中,并且不在group by
子句中。 id
来自具有最大值的行是MySQL中常见的误解。其他数据库通常不允许使用此类语法(您的查询不是标准SQL)。
你需要做两件事。首先,您需要在product_id
和warehouse_id
上进行加入,因为这些是您尝试获取最长日期的字段。其次,您需要在date_time
子句中包含on
:
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
类型为字符串,即使它最初是数字。