2014-02-10 73 views
0

我有以下查詢:MySQL查詢優化:UNION與蘭特()

(SELECT ad_code, ad_zone FROM on_ads WHERE ad_zone = 1 AND status = '1' ORDER BY RAND() LIMIT 1) UNION (SELECT ad_code, ad_zone FROM on_ads WHERE ad_zone = 2 AND status = '1' ORDER BY RAND() LIMIT 1); 

它被記錄在我的服務器慢查詢。我正在嘗試優化它。我嘗試以下查詢

(SELECT ad_code, ad_zone FROM on_ads WHERE ad_zone = 1 AND status = '1' OR ad_zone = 2 AND status = '1' ORDER BY RAND() LIMIT 2) 

但是與此查詢的問題是,第一個被選擇兩個隨機行,一個具有ad_zone = 1,而另一個具有ad_zone = 2。雖然我選擇了兩行,但不能保證它會選擇兩個不同的行(一個是ad_zone = 1,另一個是ad_zone = 2)。 我應該怎麼做來優化這個查詢?

+0

如果只是單獨運行他們,它仍然被記錄爲慢?也許這個順序隨機需要的時間太長,最好是返回所有的數據,然後在每種情況下隨機選擇一行。 –

回答

0

你必須嘗試類似的東西:

(SELECT DISTINCT(ad_code), ad_zone FROM on_ads WHERE (ad_zone = 1 OR ad_zone = 2) AND status = '1' ORDER BY RAND() LIMIT 2) 
+0

您的查詢與我的問題相同。不能保證它會選擇兩個不同的行(一個是ad_zone = 1,另一個是ad_zone = 2)。 – Khaleal

+0

我相信他希望從每個案例中獲得一個,而且你不能保證這一點。我曾想到過這個,不得不拒絕它。 –

+0

你可以對任何唯一值列或主鍵使用DISTINCT關鍵字! – Jain