2015-09-15 19 views
0

我正在尋找一種方式,MySQL表隨機抽樣,並閱讀這篇文章 - http://jan.kneschke.de/projects/mysql/order-by-rand/如何從mSQL的表隨機樣本行沒有ROWID

然而,這並沒有對我的情況,因爲工作mysql中的許多表沒有「rowid」/ autoincrement列。在這種情況下,我還可以隨機採樣行嗎?

這裏是表結構:

'CREATE TABLE `table_name` (
    `col1` date DEFAULT NULL, 
    `col2` bigint(20) DEFAULT NULL, 
    `col3` varchar(255) DEFAULT NULL, 
    `col4` varchar(64) DEFAULT NULL, 
    `col5` varchar(64) DEFAULT NULL, 
    `col6` bigint(20) DEFAULT NULL, 
    `col7` bigint(20) DEFAULT NULL, 
    `col8` varchar(255) DEFAULT NULL, 
    `col9` decimal(16,5) DEFAULT NULL, 
    `col10` bigint(20) DEFAULT NULL, 
    `col11` varchar(64) DEFAULT NULL, 
    `col12` bigint(20) DEFAULT NULL, 
    `col13` bigint(20) DEFAULT NULL, 
    `col14` bigint(20) DEFAULT NULL, 
    `col15` bigint(20) DEFAULT NULL 
) ENGINE=BRIGHTHOUSE DEFAULT CHARSET=utf8' 
+0

根據select語句中的「隨機」生成的額外列進行選擇,例如SELECT TOP 50 * FROM myTable WHERE rand()%5 = 1 –

+0

我真的在看那篇文章,但我認爲其中的一個假設是表中有一個唯一的,索引的主鍵,我不知道有。當我通過rand()limit 10從表順序中選擇column1時,我得到表中該列的前10個條目。 – md1630

+0

@RogerWillcocks - 聽起來像一個好主意,但我不確定如何在查詢中生成額外的列,那麼rand()%5 = 1又做了什麼? – md1630

回答

0

要生成一個場到SQL做,因爲這:

select * 
    from (select @id:[email protected]+1, a.* 
      from `table_name` a, 
       (select @id:=0) b 
     ) x 
    order by rand() limit 10 

的SQL這部分

from `table_name` a, 
    (select @id:=0) b 

將創建一個您的桌子和選擇之間的笛卡爾計劃只有一行。然後在它外面,你只需增加變量@id:[email protected]+1。你將擁有你生成的領域。

然後將其作爲子查詢包裝並按rand排序。

見​​

爲了測試它只是不斷撞擊在運行SQL按鈕。

編輯

因爲它沒有用 'Infobright的優化' 嘗試工作,使用純MySQL的功能,看看這樣會發生什麼:

select * from (
select n id, a.* 
    from `table_name` a, 
     (select RAND() n) b 
) x order by rand() limit 5 

看它這裏SQLFiddle 2

你會看到隨機數將是相同的,但col2值會在「run sql」按鈕上每次點擊時都會改變。

+0

謝謝你,SQLFiddle非常好用,它適用於此,但是當我在我的數據庫上嘗試時,出現錯誤「查詢包含infobright Optimizer不支持的語法」 – md1630