仅加入来自连接表的第一个匹配记录,不重复

时间:2013-08-16 10:14:11

标签: mysql join

我有两个表,1。(收件箱)保持发送报告,2。(发件箱)保持发送短信。我无法添加外键,并更改日期库结构。

收件箱

id    number       smsdate
--    ----------   -------------------
1     600600600    2013-08-16 11:51:18
2     700600600    2013-08-16 11:51:16
3     600600600    2013-08-16 11:51:14
4     900600600    2013-08-16 11:51:12

发件箱

id      number       processed_date
---     ----------   -------------------
167     600600600    2013-08-16 10:51:10
288     700600600    2013-08-16 09:51:10
356     600600600    2013-08-16 08:51:10
473     900600600    2013-08-16 07:51:10
536     600600600    2013-08-16 06:51:10

我现在加入已发送邮件的报告。我可以这样做,比较表发件箱的发送次数和日期,使用相同的号码和最近的收件箱收件箱。我确信报告将按顺序进行。

如果我使用

SELECT outbox.id, inbox.id, outbox.number, inbox.number, 
   outbox.processed_date, inbox.smsdate FROM outbox
LEFT JOIN inbox ON inbox.number= outbox.number 
   AND inbox.smsdate >= outbox.processed_date
GROUP BY outbox.id
ORDER BY outbox.id DESC;

我得到了奇怪的结果,报告重复了。如果我有3个发送,2个接收,对于相同的号码,它应该是一个空的。而不是后者的空白,它复制了我以前的空白。

我试图添加。

GROUP BY outbox.id, inbox.id

但情况更糟。

这是解决这个问题的方法吗?

期望的输出:

输出

outbox.id    inbox.id
---------    ----------  
   167         NULL 
   288          2 
   356          1
   473          4 
   536          3

2 个答案:

答案 0 :(得分:1)

我的方法是使用相关子查询来获取inbox id,然后联接回inbox表以提取所需的列:

select o.id, iid, o.number, i.number, o.processed_date, i.smsdate
from (select o.*,
             (select i.id
              from inbox i
              where i.number = o.number and
                    i.smsdate >= o.processed_date
              order by i.sms.date
              limit 1
             ) iid
      from outbox o
     ) o left outer join
     inbox i
     on o.iid = i.id
ORDER BY outbox.id DESC;

答案 1 :(得分:0)

试试这个::

SELECT outbox.id, inbox.id, outbox.number, inbox.number, 
   outbox.processed_date, inbox.smsdate FROM outbox
LEFT JOIN inbox ON inbox.number= outbox.number 
   WHERE inbox.smsdate >= outbox.processed_date