的列什麼。將選擇先前選擇的一對不同的隨機值從獨特的(非重複)的值的列的非最有效的方法的非?MySQL的優化:選擇先前選擇的隨機對不同的值從唯一值
我目前的做法是(保持每對在一個單獨的「mytable_associations」表中已關聯的值):
SELECT * FROM
(
SELECT id,count(*) AS associations_count FROM mytable
INNER JOIN mytable_associations
WHERE (myvalue=myvalue1 OR myvalue=myvalue2)
GROUP BY myvalue
HAVING associations_count<(SELECT count(*) FROM mytable)-1
ORDER BY rand() limit 1
) mytable1
LEFT JOIN
(SELECT myvalue AS myvalue2 FROM mytable) mytable2
ON mytable1.myvalue1<>mytable2.myvalue2
WHERE
(
SELECT myvalue1 FROM mytable_associations
WHERE
myvalue1=mytable1.myvalue1 AND myvalue2=mytable2.myvalue2
OR
myvalue1=mytable2.myvalue2 AND myvalue2=mytable1.myvalue1
) IS NULL;
(然後當然更新mytable_associations這個新協會)
其中,正如你所看到的,可以從一些優化中獲得巨大的收益。
(很抱歉在代碼中劣質壓痕,我真的不知道該怎麼縮進的mysql命令)。
你們能幫助我嗎?
(PS這是有史以來在這裏發佈我的第一個問題:知道我在做很多事情錯了,我會理解隨之而來的flamming,但請不要對我太狠心;))
似乎有點棘手,瞭解您的查詢。您是否介意提供一些洞察力,例如解釋查詢的不同部分以及它們的作用?這將是巨大的,如果你可以給你想要什麼來實現 – Abhay
基本上是兩個部分的虛例子:首先,我選擇不加上所有其他尚未值。我通過SELECT RANDOM FROM mytable WHERE(SELECT爲每個值FROM associations_table選擇關聯數)<(從mytable選擇count(*))-1。如果清楚的話,你可以看到其餘的只是選擇另一個尚未與associations_table中的值關聯的值:這就是最後兩個WHERE子句的用處。 – NotGaeL
只是做了一個更新,使代碼更加混亂。希望它現在更具可讀性,但無論如何看看下面的Bill Karwin的解決方案,這正是我所尋找的 – NotGaeL