如何有效地从2个mysql表中选择唯一的行/记录数据,并返回一个按时间戳排序的合并结果


How do I efficiently select unique row/record data from 2 mysql tables and return one merged result, ordered by timestamp?

堆栈:

我正试图把我网站的用户档案变成一个更像提要风格的页面。目前,该配置文件在顶部显示了一些用户统计数据,然后是用户提交的最后10条评论(按时间戳降序排列),然后是他们提交的最近10条帖子。

相反,我想做的是,按照时间戳的顺序列出最后20个"操作"(评论或提交后)(这样评论和提交将合并在列表中,而不是两个单独的列表)。你知道,就像一个"饲料"

问题是,评论是从评论表中提取的,提交是从"提交"表中提取。

通过使用联合查询从两个表中选择"comment_id/submission_id"、"将记录标识为注释或提交的字段"、"时间戳",我以一种非常低效的方式解决了这个问题。

这给了我一个结果,告诉我实体id,并将实体定义为评论或帖子,然后我可以在while mysql_fetch_array语句中发出另一个查询,以获得完整的评论或提交数据。

这对我来说似乎真的很糟糕,因为我基本上是在查询表,找到我需要的行/记录(但忽略我需要的实际数据,因为不同表的列不匹配,我认为这是联合查询所必需的),然后在while语句中返回我第一次用单个查询忽略的数据。。。

有没有我不知道的更好的方法?

附加说明:


我目前正在使用的示例sql来构建上面提到的初始结果:

select comment_id, datatype, timestamp from comments where userid=3
union all
select content_id, datatype, timestamp from submissions where userid=3
ORDER BY timestamp DESC

返回如下结果:

commentid数据类型时间戳5201发布2012-03-27 20:30:4043761评论2012-03-26 21:00:1943759评论2012-03-26 20:59:475033张贴2012-03-26 20:57:3643755评论2012-03-26 20:54:5743745评论2012-03-26 16:32:24

然后我可以使用伪代码将信息打印到配置文件页面上:

while($content_array=mysql_fetch_array($abovequery)){

根据$content_array['datatype'],通过id从注释表或提交表中获取整行的单独选择查询;

以一种漂亮的方式将个人选择查询中的相关数据回声到配置文件屏幕上;

}

这肯定可以做得更好吗?

如果无法强制两个完整查询的列,使其都可以在UNION中返回,则可以将联合结果加入注释和提交表。

SELECT records.datatype, comments.*, submissions.*
FROM (
    (
        SELECT comment_id, datatype
        FROM comments
        WHERE userid=3
        ORDER BY timestamp DESC
        LIMIT 20
    ) UNION ALL (
        SELECT content_id, datatype
        FROM submissions
        WHERE userid=3
        ORDER BY timestamp DESC
        LIMIT 20
    )
    ORDER BY timestamp DESC
    LIMIT 20
) AS records
LEFT JOIN comments
    ON records.comment_id = comments.comment_id
    AND records.datatype = 'comment'
LEFT JOIN submissions
    ON records.comment_id = submissions.content_id
    AND records.datatype = 'post'

或者,您可以使用所有必需的字段运行两个最内部的选择,然后用PHP对最终结果进行排序。