[英]What is the best approach to list a user's recent activities in PHP/MySQL?
我想列出用户在我的网站上的近期活动,而无需进行过多查询。 我有一个表,其中列出了用户使用日期所做的所有操作。
page_id - reference_id - reference_table - created_at - updated_at
reference_id
是我需要在reference_table中搜索的ID(例如:注释)。 如果要在活动表上执行SELECT
,则必须查询:
SELECT * FROM reference_table where id = reference_id LIMIT 1
活动可以是评论,页面更新或订阅。 根据它是哪一个,我需要从数据库中的其他表中获取不同的数据
例如,如果是注释,则需要获取作者的姓名,注释,如果是答复,则需要获取原始注释的用户名,等等。
我调查了UNION关键字以合并所有表,但出现错误
1222-使用的SELECT语句具有不同数量的列
使其工作似乎很复杂,因为列数必须匹配,并且我的表都没有相同的表数,我也不喜欢为此创建create列。
我还研究了CASE语句,如果我没有记错的话,该语句也需要匹配的列数(尽管我可能对此不正确)。
有谁知道如何在不进行过多查询的情况下列出用户的近期活动?
我正在使用PHP和MySQL。
您可能希望将不同的活动拆分到不同的表中。 这将使您更加灵活地查询数据。
如果选择使用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)完成相同的操作。
问题在于,仅应将UNION用于将相似的记录集组合在一起。 如果您尝试统一两个不同的查询(例如,获取了不同的列),则会出现错误。
如果查询的性质不同(具有不同的列数或数据类型),则需要进行几个不同的查询并将其分别处理。
另一种方法(我猜不太优雅)是将您的活动表与所有其他活动一起加入,因此您最终将获得一个包含许多列的记录集,并且需要检查每一行中哪些列应为根据活动性质使用。
再说一次,我宁愿坚持第一个,因为第二个要进行相当稀疏的调整。
使用UNION,您不必从每个表中获取所有列,只要所有列具有相同的数据类型即可。
因此,您可以执行以下操作:
SELECT name, comment as description
FROM Comments
UNION
SELECT name, reply as description
FROM Replies
如果Comments
和Replies
具有相同的列数也没关系。
这实际上取决于您网站上的流量。 从逻辑上讲,联合方法是一种简单直接的方法,而且可能是正确的方法,但是如果您的站点负载很重,则性能会受到影响,因为对UNIONed查询的索引很难建立。
联接可能很好,但是就性能和代码清晰度而言,这也不是最好的方法。
另一种完全不同的方法是创建一个“活动”表,该表将根据活动进行更新(除了实际活动之外,仅用于此目的)。 在旧的数据库正确性方面,您应该避免这种方法,因为它会在您的系统上创建重复的数据,但是我发现它在性能方面非常有用。
[关于UNION方法的另一条注释,如果您决定采用它:如果参数长度不同,则可以在某些联合上选择伪造的参数,例如。。(SELECT UserId,UserName FROM users)UNION(SELECT 0 ,注释中的用户名)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.