Mysql

如何從表中選擇最常見(病毒)並限制分頁結果?

  • February 11, 2019

抱歉,如果它是重複的,但我找不到問題的答案。

你好,所以我有三個表使用者和文章和喜歡,使用者可以寫一篇文章,在表文章中還有一個時間戳列,並且可以被其他使用者喜歡,其中一個喜歡保存在帶有使用者 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_ctarticle_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)獲取其他資訊。

引用自:https://dba.stackexchange.com/questions/229358