2012-04-15 52 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