1

我已经看到了这个关于如何从表中选择随机行的好答案,它在我的表上效果很好。修改我最终得到的查询:

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

但是,我需要更进一步,将可能的答案限制为符合某些标准的答案。

我认为最好的方法是构建一个临时表,只从原始表中选择有效行,然后从临时表中选择一个随机行,但是我不确定如何去做。我尝试在谷歌上搜索从随机表中创建和选择的各种组合,但到目前为止没有任何乐趣。我假设我只是不知道问我在追求什么的正确方法。

任何人都可以向我指出如何实现这一点的指南或一些示例代码吗?或者,如果我忽略了更好的解决方案,那么我愿意接受建议。

4

3 回答 3

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
于 2013-05-29T16:12:05.543 回答
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;
于 2013-05-29T14:42:30.577 回答
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
于 2013-05-29T14:42:22.050 回答