我有两张桌子:
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`))
这不起作用,子查询返回多行。
为什么这样?我该如何解决?
答案 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