选择具有其他条件的随机行

时间:2013-05-29 14:13:04

标签: mysql sql select random

我看过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搜索创建和从随机表中选择的各种组合,但到目前为止没有任何喜悦。我假设我只是不知道正确的方式来问我在追求什么。

任何人都可以请指导我或如何实现这一目标的示例代码?或者,如果有一个更好的解决方案我会忽略,那么我愿意接受建议。

3 个答案:

答案 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