2013-06-28 32 views
3

我正在制作一个小型web应用程序来发送短信。我必须向用户展示他们的最后发送的短信(如在安卓,iOS的简讯应用程式...)SMS应用程序中的接收器获取最后的消息 - SQL请求

我的三个表:

--------- ----------- ----------- 
| users | | sms | | indexes | 
--------- ----------- ----------- 
    id   id   id 
    ..   user_id  user_id 
       receiver  phone_n 
      created_at  name 

我已经做了一个SQL请求来获取最后发送短信按照索引表的名称/电话号码分组:

SELECT S.receiver, S.message, I.name, temp.last_sent, I.id 
FROM sms S 
INNER JOIN (
    SELECT receiver, user_id, MAX(created_at) AS last_sent 
     FROM sms 
     WHERE user_id = ? 
     GROUP BY receiver, user_id 
    ) temp 
ON S.receiver = temp.receiver 
AND S.user_id = temp.user_id 
AND S.created_at = temp.last_sent 
LEFT OUTER JOIN indexes I ON S.receiver = I.phone_number WHERE I.user_id = ? 
ORDER BY temp.last_sent DESC 

此SQL请求起作用。我通过接收者名称获取用户发送给它的最后一条短信。 但是我只收到SMS在接收器出现在索引表中。 没有显示发送给没有保存在这个数据库中的电话号码的接收者的所有短信。

我知道我在我的LEFT OUTER JOIN indexes上犯了一个错误。但是

那么我怎样才能得到接收者发送的最后一条短信,按last_sent排序,保存的电话号码还是不在索引中?

谢谢。

回答

2

移动WHERE子句到ON子句的LEFT OUTER JOIN

SELECT S.receiver, S.message, I.name, temp.last_sent, I.id 
FROM sms S 
INNER JOIN (
    SELECT receiver, user_id, MAX(created_at) AS last_sent 
     FROM sms 
     WHERE user_id = ? 
     GROUP BY receiver, user_id 
    ) temp 
ON S.receiver = temp.receiver 
AND S.user_id = temp.user_id 
AND S.created_at = temp.last_sent 
LEFT OUTER JOIN indexes I ON S.receiver = I.phone_number 
AND I.user_id = ? 
ORDER BY temp.last_sent DESC 
+0

工程就像一个魅力,谢谢你! – netvision73

+0

你的岩石@Kickstart – EpokK

相关问题