[英]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 1
的order 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.