簡體   English   中英

在PHP / MySQL中列出用戶最近活動的最佳方法是什么?

[英]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

如果CommentsReplies具有相同的列數也沒關系。

這實際上取決於您網站上的流量。 從邏輯上講,聯合方法是一種簡單直接的方法,而且可能是正確的方法,但是如果您的站點負載很重,則性能會受到影響,因為對UNIONed查詢的索引很難建立。

聯接可能很好,但是就性能和代碼清晰度而言,這也不是最好的方法。

另一種完全不同的方法是創建一個“活動”表,該表將根據活動進行更新(除了實際活動之外,僅用於此目的)。 在舊的數據庫正確性方面,您應該避免這種方法,因為它會在您的系統上創建重復的數據,但是我發現它在性能方面非常有用。

[關於UNION方法的另一條注釋,如果您決定采用它:如果參數長度不同,則可以在某些聯合上選擇偽造的參數,例如。。(SELECT UserId,UserName FROM users)UNION(SELECT 0 ,注釋中的用戶名)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM