多选查询 returns 行比预期少

Multiselect query returns fewer rows than expected

我正在尝试 select 5 'newest' 行(具有最高 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)

但出于某种原因,最后一个查询只执行了 return 7 行?数据库目前总共有 29 行。

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

我做错了什么SQL?

UNION 对查询中的两个 SELECT 操作进行集合联合。如果您最近的五个查询 returns 一些与您的随机查询相同的 id 值,UNION 会抑制重复项。

尝试UNION ALL

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

因此,对于第二部分,您需要 "remove" 另一个子查询中的前 5 行,然后再 "shuffle" 行:

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 子句中使用子查询 "remove" 前 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。结果将是相同的,因为不能有任何重复。但是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
)

请注意 UNION ALL allone 不是解决方案。您只会得到一些随机的重复项。