除了左连接和联合mysql查询之外,还从两个表中选择最新的条目

时间:2014-04-29 13:30:59

标签: php mysql

我有三个记录对话活动的表和一个包含用户信息的表

我正在尝试将查询汇总在一起,总结用户对话(例如收件箱中最后一条评论可见)

我的表格设置如下

users
---
company | contact_person | pic_small

alerts
---
comment_id | user_id | poster_id | timestamp

activity
---
comment_id | user_id | comment | timestamp

comments
---
comment_id | user_id | comment | timestamp

当用户最初进行联系时,用户的时间戳,comment_id和id(发送人和接收人)将被插入警报表中。 user_id,comment_id,timestamp和实际注释也会插入到活动表中。

然后,一旦对话开始,所有评论(comment_id,user_id,comment,timestamp)都会插入到评论表中。

如上所述,我要做的是总结用户活动,使其看起来像收件箱。

我提出了以下查询,该查询向我提供了登录用户收到或发送的所有会话活动的用户ID,评论ID和用户详细信息。

            SELECT alerts.comment_id,
                   alerts.user_id,
                   alerts.poster_id,
                   alerts.timestamp,
                   users.contact_person,
                   users.company,
                   users.pic_small
            FROM alerts
            LEFT JOIN users ON users.user_id = alerts.user_id
            WHERE alerts.user_id = %s
            GROUP BY alerts.comment_id
            UNION
            SELECT alerts.comment_id,
                   alerts.user_id,
                   alerts.poster_id,
                   alerts.timestamp,
                   users.contact_person,
                   users.company,
                   users.pic_small
            FROM alerts
            LEFT JOIN users ON users.user_id = alerts.poster_id
            WHERE alerts.user_id = %s
            GROUP BY alerts.comment_id
            ORDER BY TIMESTAMP DESC

我坚持的部分是从活动或评论表中获取最后一条评论(最新时间戳评论)(可能是其中之一)。很高兴在需要时完全更改上述查询。

以下是我想要实现的目标,我只想查看联系我的人或我联系过的人的用户详细信息 - 而不是我收件箱中的自己的详细信息(如果需要,我可以使用php执行此操作) - 然而,如果最后一条评论是我的,那也没关系。

enter image description here

1 个答案:

答案 0 :(得分:0)

我还不清楚你为什么要使用工会。

您可以通过以下查询获得最新评论,如果您想加入其他user_id的其他结果,那么您可以以相同的方式结合这些结果,或者如果您需要不同的结果,请告诉我。

SELECT 
comment_id,comment, user_id,poster_id,TIMESTAMP, contact_person,company,pic_small 
FROM 
(SELECT 
alerts.comment_id,alerts.user_id,alerts.poster_id,alerts.timestamp,users.contact_person,users.company,users.pic_small,act.comment 
FROM alerts 
JOIN activity act 
ON act.comment_id=alerts.comment_id 
LEFT JOIN users ON users.user_id = alerts.user_id 
WHERE alerts.user_id = %s 
ORDER BY act.timestamp DESC) a 
GROUP BY comment_id;