我看过this great answer如何从表中选择一个随机行,它在我的桌子上运行得很好。我最后修改了那个查询:
SELECT r1.clID, clUserName, clCompanyName, clBio
FROM customerlogin AS r1 JOIN
(
SELECT
(
RAND() *
(
SELECT MAX(clID)
FROM customerlogin))
AS clID)
AS r2
WHERE r1.clID >= r2.clID
ORDER BY r1.clID ASC LIMIT 1
但是,我需要更进一步,将可能的答案限制在符合某些标准的答案中。
我认为最好的方法是构建一个临时表,只选择原始表中的有效行,然后从临时表中选择一个随机行,但我不确定如何去做这样做。我已经尝试使用google搜索创建和从随机表中选择的各种组合,但到目前为止没有任何喜悦。我假设我只是不知道正确的方式来问我在追求什么。
任何人都可以请指导我或如何实现这一目标的示例代码?或者,如果有一个更好的解决方案我会忽略,那么我愿意接受建议。
答案 0 :(得分:1)
这个想法是创建一个带有自动递增主键的临时表。 “自动递增”,因此它从1开始并且是顺序的。 “主键”,因此您可以使用它来非常快速地获取行。
然后使用所需的数据子集(或数据的ID)加载表。然后使用ROW_COUNT()
获取表格中的行数,并使用rand()
获取随机行。
以下代码是(未经测试的)示例:
create temporary table temp (
id int auto_increment primary key,
clid int
);
insert into temp(clid)
select clid
from customerLogin
where <what you want>;
select @numrows := ROW_COUNT();
select @therow := (@numrows - 1) * rand();
select cl.*
from (select temp.*
from temp
where id = @therow
) temp join
CustomerLogin cl
on cl.clid = temp.clid;
答案 1 :(得分:1)
只要您的标准保持不变,您就可以创建一个视图。
视图中有这样的东西:
CREATE VIEW customerloginVIEW
AS SELECT clID, clUserName, clCompanyName, clBio
FROM customerlogin
WHERE something = somethingelse
GROUP by clID
ORDER BY clID DESC
和查询
SELECT r1.clID, clUserName, clCompanyName, clBio
FROM customerloginVIEW AS r1 JOIN
(
SELECT
(
RAND() *
(
SELECT MAX(clID)
FROM customerloginVIEW))
AS clID)
AS r2
WHERE r1.clID >= r2.clID
ORDER BY r1.clID ASC LIMIT 1
答案 2 :(得分:0)
我会得到一个可能的选择列表,选择一个随机选择,然后获取它。如下所示:
/* Get list of possible choices */
SELECT clID
FROM customerlogin
WHERE ("match criteria here")
//使用服务器端语言从此列表中选择一个随机数?
/* Reissue query to fetch the chosen random id */
SELECT *
FROM customerlogin
WHERE clID = ("chosenRandomID")
或者,看起来你可以简单地修改随机发生器选择的select语句:
SELECT r1.clID, clUserName, clCompanyName, clBio
FROM customerlogin AS r1 JOIN
(
SELECT
(
RAND() *
(
SELECT MAX(clID)
FROM customerlogin
WHERE ("match criteria here")))
AS clID)
AS r2
WHERE r1.clID >= r2.clID
ORDER BY r1.clID ASC LIMIT 1