多选Querie返回的行数少于预期

时间:2018-06-10 15:28:26

标签: mysql union union-all

我正在尝试选择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)

但由于某种原因,最后一个查询只返回7行?数据库目前共有29行。

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

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

2 个答案:

答案 0 :(得分:1)

UNION执行查询中两个SELECT操作的setwise联合。如果您的最新五个查询返回的某些id值与随机查询相同,则UNION会抑制重复项。

试试UNION ALL

答案 1 :(得分:1)

请注意,ORDER BY RAND() DESC LIMIT 10 OFFSET 5相当于ORDER BY RAND() DESC LIMIT 5 OFFSET 0,其他任何内容都不等于" 5个随机行"。你也可以写ORDER BY RAND() LIMIT 10

因此,对于你的第二部分,你要么需要"删除"在你" shuffle"之前的另一个子查询中的前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。结果将是相同的,因为不能有任何重复。但是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所有人都不是解决方案。您将获得一些随机副本。