加入后,获取每个订单ID的最新行?

时间:2013-08-09 05:54:58

标签: mysql sql subquery inner-join

我有两张桌子:

sms_send包含以下列: created_at, order_id, sms_id, mobile, msg

sms_msg包含以下列id, short_desc

sms_id对应id中的sms_msg

sms_send可以包含多个具有相同order_id的行,但sms_id可能(不)对于每个记录都相同。

sms_msg只有id个唯一身份。

我想加入两个表(仅在2013年7月1日之后创建的行,使用以下信息:

对于每个order_id,获取sms_id并加入另一个表中的short_desc,但只返回最近的记录。

因此,我会为每个order_id添加最新记录,并加入相应的short_desc

这是我的尝试:

SELECT
    *,
    `sms_msg`.`short_desc`
FROM 
    `sms_send`
INNER JOIN
    `sms_msg`
ON
    `sms_send`.`sms_id` = `sms_msg`.`id`
WHERE
    `created_at` > '2013-07-01 00:00:00'
HAVING 
    `created_at` = (SELECT `created_at` FROM `sms_msg` GROUP BY `id` HAVING `created_at` = MAX(`created_at`))

这不起作用,子查询返回多行。

为什么这样?我该如何解决?

1 个答案:

答案 0 :(得分:1)

如果created_at对于给定的order_id是唯一的,并且是DATETIME或TIMESTAMP类型,或者是规范格式的字符格式,那么这将返回指定的结果集。

SELECT s.created_at
     , s.order_id
     , s.sms_id
     , s.mobile
     , s.msg
     , t.short_desc
  FROM (
         SELECT m.order_id
              , MAX(m.created_at) AS latest_created_at
           FROM sms_send m
          WHERE m.created_at >= '2013=07-01' 
          GROUP
             BY m.order_id
       ) l
  JOIN sms_send s
    ON s.order_id = l.order_id
   AND s.created_at = l.latest_created_at
  JOIN sms_msg t
    ON t.id = s.sms_id