我一直在寻找从表中选择随机行的快速方法,并找到了以下网站: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;
答案 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