选择所有ORDER BY视图并使每个第3项随机

时间:2018-03-09 20:51:25

标签: mysql sql database graphql

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

是否可以编写一个返回products一个或多个字段排序的查询(例如视图和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的数量会随着时间的推移而发生变化。

1 个答案:

答案 0 :(得分:2)

好的,这个请求很可怕,但它应该能满足你的期望

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 |