在MySQL中,如何在按排序列排序的同時考慮資料的時間變化來取得下一行資料?
P粉420958692
P粉420958692 2023-09-07 14:37:40
0
1
540

好的,我的問題有點具體,很難解釋。所以我會盡量簡化。

我有一個MySQL表格,裡面顯示著網站上的「提示」。這些提示會依照「順序」列中的整數排序。所以表格看起來像這樣:id(int自增),提示(varchar),順序(int)。

現在,當第一個提示顯示給使用者時,它會一直顯示,直到使用者確認,然後顯示下一個提示,依此類推。

我想出了一個查詢,根據用戶上次確認的提示來獲取下一個提示:

SELECT hint FROM hints WHERE `order` > $last_seen_item_order ORDER BY `order` DESC LIMIT 1

這個查詢很好用。然而,我們有時也需要添加新的提示,通常不是添加在最後一個提示,而是在中間某個位置。所以例如,使用者看到了順序為#6的最後一個提示,但我們在位置#3新增了新的提示。這個新的提示將永遠不會顯示給這個用戶,因為我們已經保存了他已經看過提示#6。

有沒有辦法來管理這個問題?可能只需要一個或兩個MySQL查詢嗎?

提前感謝任何幫助和提示。

編輯:每個使用者都有自己的「已看狀態」。我們簡單地將其保存在PHP的$_SESSION['last_seen_item_order']中。

P粉420958692
P粉420958692

全部回覆(1)
P粉798343415

您不能按照這種邏輯來管理它。

為此,您需要維護一個額外的欄位 - seen 如果使用者已經看到了hints,您可以將其設定為1 因此,您的查詢將是 -

SELECT 
   hint 
FROM
  hints 
WHERE 
  `order` > last_seen_item_order
   OR seen = 0 
ORDER BY 
   CASE WHEN `order` > last_seen_item_order THEN `order` END DESC
   CASE WHEN `order` <= last_seen_item_order THEN `id` END ASC
LIMIT 1

注意 - 這是我建議的做法。您可以有很多其他的想法。

編輯 - 如果您想要按使用者維護提示,那麼您可能有兩個選項來維護seen

  1. 為使用者維護json格式的已看到提示。
  2. 建立一個名為user_hints_see的單獨表,其中包含id(自增)、user_idhint_idseen列。
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板