我正在尝试选择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中做错了什么?
答案 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
所有人都不是解决方案。您将获得一些随机副本。