【问题标题】:What is the best approach to list a user's recent activities in PHP/MySQL?列出用户最近在 PHP/MySQL 中的活动的最佳方法是什么?
【发布时间】:2009-03-11 17:12:43
【问题描述】:

我想在不进行太多查询的情况下列出用户最近在我的网站上的活动。我有一张表格,其中列出了用户对日期所做的所有事情。

page_id - reference_id - reference_table - created_at - updated_at

reference_id 是我需要在 reference_table 中搜索的 ID(例如:cmets)。如果我要在我的活动表上执行SELECT,我将不得不查询:

SELECT * FROM reference_table where id = reference_id LIMIT 1

活动可以是评论、页面更新或订阅。根据它是哪一个,我需要从我的数据库中的其他表中获取不同的数据

例如如果是评论,我需要获取作者姓名,评论,如果是回复我需要获取原始评论用户名等。

我已经查看了 UNION 关键字来合并我的所有表,但我收到了错误

1222 - 使用的 SELECT 语句的列数不同

让它工作似乎相当复杂,因为列的数量必须匹配,而且我的表中没有一个表具有相同数量的表,而且我不喜欢为了好玩而创建列。

我还研究了 CASE 语句,如果我没记错的话,它还需要匹配的列数(不过我可能错了)。

有没有人知道如何在不进行太多查询的情况下列出用户最近的活动?

我正在使用 PHP 和 MySQL。

【问题讨论】:

  • 我建议编辑以提供更有意义的标题。

标签: php mysql


【解决方案1】:

您可能希望将不同的活动拆分到不同的表中。这将使您更灵活地查询数据。

如果您选择使用 UNION,请确保在组成 UNION 的每个选择查询中使用相同数量的列。

编辑: 我的回答被否决了,所以也许我可以给出更好的解释。

将表拆分为单独的表和 UNION

我推荐了这种技术,因为它可以让您更明确地了解要查询的资源。有一个用于插入的表很方便,但您总是必须执行单独的查询才能与其他表连接以获得有意义的信息。此外,根据存储在该行中的数据,您的数据库架构将被单个列作为不同表的外键混淆。

您可以拥有用于评论、更新和订阅的表格。这些将有自己的数据,可以单独查询。例如,如果您想查看所有用户活动,您可以轻松地使用 UNION,如下所示:

(SELECT 'comment', title, comment_id AS id, created FROM comment)
UNION
(SELECT 'update', title, update_id as id, created FROM update)
UNION
(SELECT 'subscription', title, subscription_id as id, created 
  FROM subscription)
ORDER BY created desc

这将为您提供一个列表视图。然后,您可以链接到每种类型的详细信息或将其加载到 ajax 调用中。

您可以使用当前使用的方法完成此操作,但这实际上将消除对“reference_table”的需求,并且将以更简洁的方式完成相同的事情 (IMO)。

【讨论】:

    【解决方案2】:

    问题是 UNION 应该只用于将相似记录集放在一起。如果您尝试统一两个不同的查询(例如,获取不同的列),则会出现错误。

    如果查询的性质不同(具有不同的列数或数据类型),您将需要进行几个不同的查询并分别处理它们。

    另一种方法(我猜不太优雅)是将活动表与所有其他表连接起来,因此您最终会得到一个包含很多列的记录集,并且您需要检查每一行应根据活动性质使用列。

    再次,我宁愿坚持第一个,因为第二个产生了一个相当稀疏的 recorset。

    【讨论】:

      【解决方案3】:

      使用 UNION,您不必从每个表中获取所有列,只要所有列具有相同的数据类型即可。

      所以你可以这样做:

      SELECT name, comment as description
      FROM Comments
      
      UNION
      
      SELECT name, reply as description
      FROM Replies
      

      CommentsReplies 的列数是否相同也没关系。

      【讨论】:

        【解决方案4】:

        这实际上取决于您网站上的流量。从逻辑上讲,联合方法是一种简单且可能是正确的方法,但是如果您的站点负载很重,则性能会受到影响,因为联合查询的索引很困难。

        加入可能很好,但同样,就性能和代码清晰度而言,这并不是最好的方法。

        另一种完全不同的方法是创建一个“活动”表,该表将根据活动进行更新(除了实际活动,仅用于此目的)。在旧的数据库正确性方面,您应该避免这种方法,因为它会在您的系统上创建重复数据,但是我发现它在性能方面非常有用。

        [如果您决定采用 UNION 方法,请注意另一个注意事项:如果参数长度存在差异,您可以在某些联合上选择虚假参数,例如.. (SELECT UserId,UserName FROM users) UNION (SELECT 0,用户名来自笔记)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-06-24
          • 2015-06-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多