SQL:从表中选择随机行,其中行的ID不在另一个表中?

时间:2010-03-26 20:13:40

标签: sql random row

我一直在寻找从表中选择随机行的快速方法,并找到了以下网站:http://74.125.77.132/search?q=cache:http://jan.kneschke.de/projects/mysql/order-by-rand/&hl=en&strip=1

我想要做的是从我的表'urls'中选择一个我在其他表'urlinfo'中没有的随机网址。我现在使用的查询现在从'urls'中选择一个随机网址但是我需要将其修改为仅返回“urlinfo”表中不存在的随机网址。

继承人查询:

SELECT url 
FROM urls JOIN (SELECT CEIL(RAND() * (SELECT MAX(urlid)
                                     FROM urls
                                     )
                           ) AS urlid 
               ) AS r2 USING(urlid);

两张桌子:

CREATE TABLE urls (
 urlid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
 url VARCHAR(255) NOT NULL
) ENGINE=INNODB;


CREATE TABLE urlinfo (
 urlid  INT NOT NULL PRIMARY KEY,
 urlinfo VARCHAR(10000),
 FOREIGN KEY (urlid) REFERENCES urls (urlid)
   ) ENGINE=INNODB;

3 个答案:

答案 0 :(得分:3)

如何使用这个随机解决方案:

SELECT TOP 1 * FROM urls
WHERE (SELECT COUNT(*) FROM urlinfo WHERE urlid = urls.urlid) = 0
 ORDER BY NEWID()

答案 1 :(得分:1)

您需要先执行左外连接以获取'url'中不在'urlinfo'中的记录集,然后从该集合中选择一个随机记录。

SELECT * FROM urls
LEFT OUTER JOIN urlinfo
ON urls.urlid = urlinfo.urlid
WHERE urlinfo.urlid IS null

现在从这个集合中选择一个随机行 - 您可以执行类似

的操作
SELECT newUrls.url
FROM (    
      SELECT urls.urlid, urls.url FROM urls
      LEFT OUTER JOIN urlinfo
      ON urls.urlid = urlinfo.urlid
      WHERE urlinfo.urlid IS null
     ) as newUrls
WHERE urls.urlid >= RAND() * (SELECT MAX(urlid) FROM urls) LIMIT 1

但是,只有当urlinfo中的urlids大致随机分布在可能的值范围内时,这才有效。

答案 2 :(得分:1)

您可以使用where not exists排除另一个表中的行。对于随机行,一个选项是带有order by rand()的{​​{1}}:

limit 1