其中在 + Rand() + 限制
Where In + Rand() + Limit
我有一个像这样的数据库 "link":
id(primary) | name_id | type | url
我正在尝试为 5 个独特的 name_id 随机查找 URL。我想只为一个人做这个:
SELECT url
FROM link
WHERE name_id=1
ORDER BY RAND()
LIMIT 1
有效。所以,我想了五个,这样做:
SELECT url
FROM link
WHERE name_id IN (1,2,3,4,5)
ORDER BY RAND()
LIMIT 5
但是,它不起作用,因为它找到 name_id=1 的 2 个结果和 name_id=2 的 3 个结果,例如(在数据库中我可以有 10 多行一个 name_id).
我想 return 为 1 个请求 SQL 中的每个 name_id 随机 url。怎么做?
如果你知道这五个,那么你可以使用 union all
:
(SELECT url FROM link WHERE name_id = 1 ORDER BY RAND() LIMIT 1
) UNION ALL
(SELECT url FROM link WHERE name_id = 2 ORDER BY RAND() LIMIT 1
) UNION ALL
(SELECT url FROM link WHERE name_id = 3 ORDER BY RAND() LIMIT 1
) UNION ALL
(SELECT url FROM link WHERE name_id = 4 ORDER BY RAND() LIMIT 1
) UNION ALL
(SELECT url FROM link WHERE name_id = 5 ORDER BY RAND() LIMIT 1
);
如果性能有问题,还有其他方法可以更快地获取 "random" 行。
但是,如果给定名称只有 10 个左右的 URL,那么以上内容应该没问题。 . .特别是 link(name_id, url)
.
上的索引
我有一个像这样的数据库 "link":
id(primary) | name_id | type | url
我正在尝试为 5 个独特的 name_id 随机查找 URL。我想只为一个人做这个:
SELECT url
FROM link
WHERE name_id=1
ORDER BY RAND()
LIMIT 1
有效。所以,我想了五个,这样做:
SELECT url
FROM link
WHERE name_id IN (1,2,3,4,5)
ORDER BY RAND()
LIMIT 5
但是,它不起作用,因为它找到 name_id=1 的 2 个结果和 name_id=2 的 3 个结果,例如(在数据库中我可以有 10 多行一个 name_id).
我想 return 为 1 个请求 SQL 中的每个 name_id 随机 url。怎么做?
如果你知道这五个,那么你可以使用 union all
:
(SELECT url FROM link WHERE name_id = 1 ORDER BY RAND() LIMIT 1
) UNION ALL
(SELECT url FROM link WHERE name_id = 2 ORDER BY RAND() LIMIT 1
) UNION ALL
(SELECT url FROM link WHERE name_id = 3 ORDER BY RAND() LIMIT 1
) UNION ALL
(SELECT url FROM link WHERE name_id = 4 ORDER BY RAND() LIMIT 1
) UNION ALL
(SELECT url FROM link WHERE name_id = 5 ORDER BY RAND() LIMIT 1
);
如果性能有问题,还有其他方法可以更快地获取 "random" 行。
但是,如果给定名称只有 10 个左右的 URL,那么以上内容应该没问题。 . .特别是 link(name_id, url)
.