mysql - 选择所有 ORDER BY View 并使每 3 个项目随机

标签 mysql sql database graphql

Products
-- id [int]
-- name [string]
-- views [int]

是否可以编写一个查询,返回按一个或多个字段(例如浏览次数和 ID)排序的产品,并使每第 3 个项目完全随机?

大意是我有一些产品:

+----+-----------+-------+
| id |   name    | views |
+----+-----------+-------+
|  1 | Product 1 |    12 |
|  2 | Product 2 |    65 |
|  3 | Product 3 |    23 |
|  4 | Product 4 |    23 |
|  5 | Product 5 |    32 |
|  6 | Product 6 |    76 |
|  7 | Product 7 |    35 |
|  8 | Product 8 |    91 |
|  9 | Product 9 |    73 |
+----+-----------+-------+

我想展示最受欢迎的产品,所以我想按浏览量排序。但是,不受欢迎的产品如果没有足够的牵引力,将无法与其他产品竞争。如果我能偶尔展示一些流行产品中的冷门产品,让它们也流行起来,那就太好了。

数据库:我将使用 graphql 和 mysql,但任何解决方案都会有所帮助

项目总数:

页数:每页 9 - 18

重要的是我只需创建一次数据库结构。可以设置有助于排序的任何其他列(属性)。只有 views 的数量会随时间变化。

最佳答案

好吧,这个请求很可怕,但它应该给你你所期望的

SQL Fiddle

MySQL 5.6 架构设置:

查询 1:

SELECT * 
FROM (
    SELECT * 
    FROM T 
    ORDER BY `VIEWS` DESC 
    LIMIT 2
    ) A

UNION ALL

SELECT * 
FROM (
    SELECT * 
    FROM T T0
    WHERE NOT EXISTS (
        SELECT 1 
        FROM (
            SELECT ID 
            FROM T 
            ORDER BY `VIEWS` DESC 
            LIMIT 2
            ) T1
        WHERE T1.ID = T0.ID
        )
    ORDER BY RAND()
    LIMIT 1
    ) B

Results :

| id |      name | views |
|----|-----------|-------|
|  8 | Product 8 |    91 |
|  6 | Product 6 |    76 |
|  3 | Product 3 |    23 |

关于mysql - 选择所有 ORDER BY View 并使每 3 个项目随机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49201960/

相关文章:

Mysql消息系统-如何查询?

mysql - 定期将数据从 SQL 镜像到 NoSQL 的最佳方法?

mysql - 将新的行集添加到现有查询的结果集中

database - Entity Framework 5 迁移中不可能进行数据库重构吗?

java - 数据未插入 SQLite 数据库

mysql查询问题

Mysql:如何构造这些数据并搜索它

php - 如何根据要求在一天中给出条件

sql - 如何使用 JOIN 而不是 UNION 来计算 "A OR B"的邻居?

mysql - 我如何比较两行并将两行的相似性存储在另一列中