繁体   English   中英

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

[英]SQL: select random row from table where the ID of the row isn't in another table?

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

我想做的是从我的其他表'urlinfo'中没有的表'urls'中选择一个随机URL。我正在使用的查询现在从'urls'中选择一个随机URL,但我需要对其进行修改只返回不在“ 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;

如何使用此随机解决方案:

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

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

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中的urlid大致随机分布在可能值的范围内时,这才起作用。

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

SELECT url
FROM urls
WHERE NOT EXISTS (
    SELECT *
    FROM urlinfo ui
    WHERE ui.urlid = urls.urlid
)
ORDER BY RAND()
LIMIT 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM