簡體   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