代码之家  ›  专栏  ›  技术社区  ›  ii iml0sto1

多选查询返回的行数少于预期

  •  1
  • ii iml0sto1  · 技术社区  · 7 年前

    我正在尝试选择5个“最新”行(具有最高ID的行),然后选择10个不应是5个最新行中任何一个的随机行。

    (SELECT t1.img_app_id 
     FROM imgs_app t1 
     ORDER BY t1.img_app_id DESC 
     LIMIT 5)
    UNION
    (SELECT t2.img_app_id 
     FROM imgs_app t2 
     ORDER BY RAND() DESC 
     LIMIT 10 OFFSET 5)
    

    但出于某种原因,最后一个query只返回7行?数据库当前共有29行。

    当我订购DESC时,我应该先得到最高的ID,当我使用偏移量5时,我不应该得到最新的5行中的任何一行,对吗?

    我在这个sql中做错了什么?

    2 回复  |  直到 5 年前
        1
  •  1
  •   Paul Spiegel    7 年前

    注意 ORDER BY RAND() DESC LIMIT 10 OFFSET 5 相当于 ORDER BY RAND() DESC LIMIT 5 OFFSET 0 ,也就是“5个随机行”。你也可以只写 ORDER BY RAND() LIMIT 10

    因此,对于第二部分,您要么需要“移除”另一个子查询中的前5行,然后再“洗牌”这些行:

    SELECT img_app_id 
    FROM (
        SELECT img_app_id 
        FROM imgs_app
        ORDER BY img_app_id DESC 
        LIMIT 9999999999 OFFSET 5
    ) sub
    ORDER BY RAND()
    LIMIT 10
    

    另一种方法(可能更快)是使用where子句中的子查询“删除”前5行:

    SELECT img_app_id 
    FROM imgs_app
    WHERE img_app_id <= (
        SELECT img_app_id
        FROM imgs_app
        ORDER BY img_app_id DESC
        LIMIT 1 OFFSET 5
    )
    ORDER BY RAND()
    LIMIT 10
    

    现在你可以使用 UNION [DISTINCT] UNION ALL . 由于没有复制品,结果将是相同的。但是 联合所有 避免不必要的分类。

    最后一个问题是:

    (
        SELECT t1.img_app_id 
        FROM imgs_app t1 
        ORDER BY t1.img_app_id DESC 
        LIMIT 5
    ) UNION ALL (
        SELECT img_app_id 
        FROM imgs_app
        WHERE img_app_id <= (
            SELECT img_app_id
            FROM imgs_app
            ORDER BY img_app_id DESC
            LIMIT 1 OFFSET 5
        )
        ORDER BY RAND()
        LIMIT 10
    )
    

    注意 联合所有 阿伦不是解决办法。你只会得到一些随机的副本。

        2
  •  1
  •   O. Jones    7 年前

    UNION 两者的集合 SELECT 查询中的操作。如果最近的五个查询返回一些相同的 id 值作为随机查询, 联合 抑制重复项。

    尝试 UNION ALL