mySQL限制JOIN语句中的行数

时间:2013-08-09 11:30:38

标签: mysql sql join

假设让表包含以下数据:

|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

1 个答案:

答案 0 :(得分:3)

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

你需要做两件事。首先,您需要在product_idwarehouse_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类型为字符串,即使它最初是数字。