Mysql
如何從表中選擇最常見(病毒)並限制分頁結果?
抱歉,如果它是重複的,但我找不到問題的答案。
你好,所以我有三個表使用者和文章和喜歡,使用者可以寫一篇文章,在表文章中還有一個時間戳列,並且可以被其他使用者喜歡,其中一個喜歡保存在帶有使用者 ID 的喜歡表中,並且秘密身份證。
文章表:
+----+---------+--------------------+ | id | article | timestamp | +----+---------+--------------------+ | 1 | A |2019-02-10 22:19:02 | | 2 | B |2019-02-9 22:20:28 | | 3 | C |2019-02-9 22:21:10 | | 4 | D |2019-02-8 18:20:10 | | 5 | E |2019-02-8 13:25:04 | +----+---------+--------------------+
喜歡表:
+-----------+--------+ | articleid | userid | +-----------+--------+ | 1 | 1 | | 1 | 3 | | 1 | 5 | | 1 | 3 | | 2 | 1 | | 3 | 2 | | 3 | 3 | | 3 | 4 | | 3 | 5 | | 3 | 2 | | 4 | 4 | +-----------+--------+
我試圖在最短的時間內對最喜歡的文章進行分頁,
例如在這種情況下,文章 A 是訂單的頂部,因為它在更短的時間內獲得了更多的喜歡,
我將如何做到這一點,同時時間限制結果做分頁?
我的嘗試是:
SELECT * FROM articles, (SELECT count(*) FROM likes WHERE articleid = id) as likes GROUP BY articles OREDER BY likes LIMIT 10
我會在沒有限制的情況下在 php 中執行此操作,但同時我想重複查詢以以相同的方式獲取第二頁的下一篇文章,但我不知道該怎麼做。
提前致謝!
一旦數據庫不僅僅是一個“玩具”,您將需要保持一個最新(或幾乎如此)的實際喜歡計數表。它將有兩列:article_id 和 like_ct
article_id
作為 PK。有了它(加上一個
JOIN
),你可以在沒有OFFSET
.最近一兩天最喜歡
從一個 2 列表開始:
CREATE TABLE Likes ( article_id ..., -- for JOINing to Articles ts TIMESTAMP NOT NULL, PRIMARY KEY (article_id) ) ENGINE=InnoDB;
這應該會為您提供過去 2 天內按最多贊排序的 article_id 列表,從執行查詢的那一刻開始倒計時。
SELECT article_id, COUNT(*) AS like_ct FROM Likes WHERE ts >= NOW() - INTERVAL 2 DAY GROUP BY article_id ORDER BY tot_likes DESC
有了
LIMIT 10
您可以獲得前 10 名。OFFSET
您可以低效地獲得其他“頁面”。將上述內容用作“派生”表並
JOIN Articles USING(article_id)
獲取其他資訊。