2012-04-15 85 views
1

有什麼方法可以引用聯合中的子查詢?MYSQL,聯盟中的子查詢引用

我試圖做類似以下內容,想避免臨時表,但子查詢從一個更大的數據集是很有意義只做一次繪製..

SELECT * FROM (SELECT * FROM ads WHERE state='FL' AND city='Maitland' AND page='home' ORDER BY RAND()) AS sq WHERE spot = 'full-banner' LIMIT 1 
UNION 
SELECT * FROM sq WHERE spot = 'leaderboard' LIMIT 1 
UNION 
SELECT * FROM sq WHERE spot = 'rectangle1' LIMIT 1 
UNION 
SELECT * FROM sq WHERE spot = 'rectangle2' LIMIT 1 
.... etc,, 

令人遺憾的是,不能爲結果集的單個列指定DISTINCT。

回答

1

那麼,沒有辦法做你想做的事情,而不重複創建派生表。

如果查詢ads真的很貴,那麼你應該嘗試添加一個索引,如:

alter table ads add index (state, city, page, spot); 

如果並稱索引的查詢需要太多之後,那麼我建議你創建一個表來存儲這些數據,並然後爲每個點查詢該表。

根據你的數據,你可以玩GROUP BY獲得類似的結果。

+0

因爲tbl只是第一個子查詢的引用。也許這個名字有點混亂。廣告表很大,但在子查詢之後它只有大約90行。我會更新別名以避免混淆。 – christian 2012-04-15 17:24:55

+0

明白了。更新了我的答案。 – 2012-04-15 17:33:08

+1

我的初步測試表明,以下是我想要的! SELECT * FROM(SELECT * FROM ads WHERE state ='FL'and city ='Maitland'ORDER BY RAND())sq GROUP BY sq .spot ...所以GROUP BY只爲每個子句返回一個結果?我在想這跟ORDER BY很相似。謝謝 – christian 2012-04-15 18:22:49