2016-08-04 50 views
0

我有一組值(不連續)在表B(編號)需要隨機更新一列。但隨機值列舉

我需要用這些值隨機更新TableA列。

這個查詢會做我想要的嗎?

update TableA set column1 = (select id from TableB order by rand() limit 1) 

這是正確的方法嗎?

+0

「TableA」的'Column1'中的當前值是什麼?我用目前的方法看到的問題是,您最終可能會使用相同的值兩次。 –

+0

您當前的查詢會將'TableA'中所有行中的所有'column1'字段設置爲從'TableB'中隨機選擇的同一個'id'值。目前還不清楚這是否是你想要的 - 請澄清。 – Synchro

+0

謝謝@Synchro我使用Mysql。所以它運行良好。它不填充相同的值。 –

回答

0

關於你提出的聲明:

update TableA set column1 = (select id from TableB order by rand() limit 1) 

其行爲是有點不可預知的。我期望它只運行一次子查詢,然後用它提供的值更新TableA的所有行,但顯然MySql 確實爲運行子查詢tableA的每個記錄。

但是,您仍然會得到TableB的一些值,這些值分配給TableA的幾行。如果你不希望發生這種情況,它會變得更加複雜。

如果您TableA具有獨特id場,我建議這樣的:

update  TableA 
inner join (select id, @rnA := @rnA + 1 as rnA 
      from TableA, 
        (select @rnA := 0) init 
      ) orderA 
     on TableA.id = orderA.id 
inner join (select id, @rnB := @rnB + 1 as rnB 
      from (select * from TableB order by rand()) randB, 
        (select @rnB := 0) init 
      ) orderB 
     on rnB = rnA   
set  TableA.column1 = orderB.id; 

兩個子選擇orderAorderB添加一個額外的列:rnArnB,這是從1開始順序編號。

連接條件要求這兩個值相等。這將使得一個記錄匹配來自TableA的最多一條記錄。由於TableB首先按隨機順序重新排序,結果將是你所期望的。

+0

非常感謝@trincot –

+0

不客氣。 – trincot