【问题标题】:How to display results from multiple mysql tables orderd by a date column in one loop如何在一个循环中显示按日期列排序的多个mysql表的结果
【发布时间】:2016-03-31 21:18:15
【问题描述】:

我正在使用 PHP 和 MYSQL 显示最新用户活动的概览

我有五个活动,但假设我们只有两个活动(posts 和 cmets),所以基本上使用 MYSQL 我必须从两个按日期列排序的表中获取结果(所有活动表都有一个日期列) ,然后使用 PHP 我需要遍历这些结果,并且对于每种结果类型(帖子或评论)我需要以不同的方式处理它(帖子和 cmets 具有不同的 html)。

我首先想到的是 MYSQL UNION ALL 运算符,但 w3schools 说

UNION 中的每个 SELECT 语句必须具有相同数量的列。这些列还必须具有相似的数据类型。另外,每个 SELECT 语句中的列必须是相同的顺序

而且我的帖子和 cmets 表没有相同数量的列或数据类型,我也不知道如何以不同的方式处理每种结果类型。

我迷路了,知道吗,如果你能以任何方式帮助我,那就太好了,谢谢。

额外

这是帖子和 cmets 表的示例

-- Comments table  
id|user_id|post_id|c_date|comment

-- Posts table
id|user_id|p_date|title|content

更新1

我不想加入行,我想将每一行显示为自己的,而不是与另一行加入。

【问题讨论】:

  • 使用join操作
  • 你能告诉我们更多关于表格结构的信息吗? iduid 是什么?它们是否相互关联?
  • @ShaifulIslam join 用于将行连接在一起,我不想连接行,我想将每一行显示为自己的,而不是与另一行连接。
  • 因为posts和cmets有不同的html,php解决方案值得一试。
  • 那么如何知道用户是否在post 中发表了评论?

标签: php mysql


【解决方案1】:
SELECT column 1, column 2, '' AS 'column 3' FROM table a
UNION  
SELECT column 1, column 2, column 3 FROM table b

如果你事先知道表的结构,你可以通过以下方式使用UNION

【讨论】:

  • 但是如何以不同的方式处理每种结果类型呢?
【解决方案2】:

在一个查询中没有“优雅”的方法可以做到这一点。我推荐以下:

  1. 为每个表编写并执行查询
  2. 将结果映射到 php 数组,并在每个结果行中添加 type (comment/post/...) 字段
  3. 按日期对数组进行排序(例如使用usort

使用每个结果行上的type,您可以决定如何在循环中呈现它(使用不同的 html)。

【讨论】:

  • 这似乎是迄今为止最好的方法。
【解决方案3】:

您可以编写一个查询,将两个表中的内容提取到一行中。查询应该是这样的:

SELECT c_date, p_date, comment, title, content FROM Comments, Posts WHERE Comments.u_id = 'user' AND Posts.u_id = 'user'

尝试使用 LIMIT 和 ORDER BY 子句,并记住使用表别名和/或完全限定的列名。

【讨论】:

  • 但是如何以不同的方式处理每种结果类型呢?
  • 使用列名。用户最后一条评论在'comment'中,时间在'c_date'中,用户最后一条帖子在'title'和'content'中,它的时间在'p_date'中,以此类推。这就是为什么我说别名可能很重要。
  • 你能给我举个简单的例子看看吗?如果你不介意的话。
  • 我可以,但我想确定我的假设,即您正在寻找用户每种类型活动的最新 (ONE) 活动。即最后的评论,最后的帖子等,而不是最近的 cmets 和最近的帖子的列表
  • 我正在寻找最近的 cmets 和帖子的列表
【解决方案4】:

为什么不创建另一个名为“useractivities”或smth 的表。像这样,并像这样构造它:

  • 身份证
  • 用户ID
  • 操作(发布、回答、注册、登录……)
  • actionID(这个链接到具体表中的id)
  • 时间戳

每次发生您想要记录的事情时,只需在此表中生成一个条目。

这样,您只需要查询这张表即可获取选定用户的最新用户活动,或者您将能够获取页面上的所有最新活动。

【讨论】:

  • 我一开始就想到了,但我不喜欢它,每次发生某些事情(发布、评论、评论……)我都需要将它发布到该表,当用户删除(帖子,评论,评论,...)我也需要从该表中删除,每个表(帖子,评论,评论,...)都有一些我需要的导入列,如内容,所以我会必须从“useractivities”表的每个结果中的每个表(帖子、评论、评论……)中获取它。
  • 那么例如为什么不为用户生成的任何实体创建一个通用表?它基本上是相同的,除了您还可以创建帮助表来存储额外的数据。您还可以创建一个由用户活动表中的变量填充的查询。 SELECT * from $action WHERE ID = $actionID, $actionID2, ...
  • 这将生成 n + 1 db 查询,n 是您总共拥有的操作表的数量。如果您只有发布、评论,这将导致总共 3 个数据库查询来显示此页面。
【解决方案5】:

我找到了解决这个问题的好方法,这里是MYSQL语法

SELECT c_date AS date, comment AS content, '' AS title, 'comment' AS type FROM comments
UNION ALL 
SELECT p_date AS date, content, title, 'post' AS type FROM posts
ORDER BY date DESC

这里的技巧是在 MYSQL 中使用 'AS' 为列赋予相同的名称 (c_date AS date) (comment AS content),并匹配它们 ('' AS title),以及也可以使用它们作为变量来保存 'type' ('comment' AS type)

我使用 php 遍历结果并使用 'type' 以不同方式处理每种结果类型

$results = $connection->query($mysql_syntax);
if ($results->num_rows > 0) {
    while($row = $results->fetch_assoc()) {
        if($row['type'] == 'comment'){
            COMMENT HTML CODE HERE
        }elseif($row['type'] == 'post'){
            POST HTML CODE HERE
        }
    }
}

如果不是 @Kaushal Shah 的回答,我不会喜欢这个解决方案,我还要感谢 @dtkahl 的回答

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    相关资源
    最近更新 更多