代码之家  ›  专栏  ›  技术社区  ›  Michal

选择所有ORDER BY视图,并随机设置每三个项目

  •  1
  • Michal  · 技术社区  · 8 年前
    Products
    -- id [int]
    -- name [string]
    -- views [int]
    

    是否可以编写一个返回 products 按一个或多个字段排序(例如视图数和id),并使每三个项目完全随机?

    总的来说,我有一些产品:

    +----+-----------+-------+
    | 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 回复  |  直到 8 年前
        1
  •  2
  •   Blag    8 年前

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

    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 |