多选查询 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 不是解决方案。您只会得到一些随机的重复项。
我正在尝试 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 不是解决方案。您只会得到一些随机的重复项。