2012-02-20 67 views
5

MySQL文档说:“您不能在同一查询中多次引用TEMPORARY表。”如何在同一查询中多次引用TEMPORARY表?

我知道这已被问过。但我无法找到以下的具体解决方案。

我做了预选到一个临时表

CREATE TEMPORARY TABLE preselection AS SELECT ...; 

现在我想要做一些(约20或甚至30)工会

(SELECT FROM preselection ...) 
UNION 
(SELECT FROM preselection ...) 
UNION 
...... 
UNION 
(SELECT FROM preselection ...) 

我可以做预选的20个或30个拷贝并在每个表上进行每种选择,但是如果我理解正确,这与在UNION链内的每个SELECT中作为子查询调用上面的预选查询相同。

有没有办法解决这个问题?

问候,

克里斯

全面查询:

CREATE TEMPORARY TABLE preselection AS 
(
SELECT id, title, chapter, date2, date, snid, max(score) FROM `movies` 

WHERE 
(
cluster is not NULL 
) 
AND 
(
`date` <= '2012-02-20 05:20:00' 
AND `date` > '2012-02-19 17:20:00' 
AND (TIMEDIFF(date, date2) < '12:00:00') 
) 
GROUP BY cluster 
) 
UNION 
(
SELECT id, title, chapter, date2, date, snid, score FROM `movies` 
WHERE cluster IS NULL 
AND 
(
`date` <= '2012-02-20 05:20:00' AND `date` > '2012-02-19 17:20:00' AND (TIMEDIFF(date, date2) < '12:00:00') 
) 
); 

(SELECT * FROM preselection WHERE snid=1 AND chapter LIKE '#A_OT%' 
DESC LIMIT 4) 
UNION 
… 
UNION 
(SELECT * FROM preselection WHERE snid=19 AND chapter LIKE '#A_OT%' 
LIMIT 4) 
UNION 
... for each chapter from A to J and every snid from 1 to 19 ... 
UNION 
(SELECT * FROM preselection WHERE snid=1 AND chapter LIKE '#J_OT%' 
LIMIT 4) 
UNION 
… 
UNION 
(SELECT * FROM preselection WHERE snid=19 AND chapter LIKE '#J_OT%' 
LIMIT 4) 

ORDER BY `score` DESC, `date`; 
+0

可能重复[在MySql中多次访问临时表](http://stackoverflow.com/questions/4078873/accessing-a -temporary-table-multiple-times-in-mysql) – 2012-02-20 16:33:33

+1

你可以显示完整的真实查询吗?它可以帮助我们提出一种解决方案,不需要多次添加临时表。 – JohnFx 2012-02-20 16:42:34

+0

也许这是个好主意。在这里,我的完整查询,我真的不知道如何以不同的方式做到这一点。 (添加到帖子) – 2012-02-23 15:32:55

回答

4

我认为错误信息是明确的:你不能这样做,有一个临时表。创建数据视图而不是临时表是否有用?

Views in mysql

+0

我一直在为这个“诡计”处理很多不同的问题。习惯于习惯是一种好习惯。 – northpole 2012-02-20 16:35:24

+0

@Mosty,问题与意见是他们是全球性的。似乎没有办法创建会话本地“临时视图”。这会在有多个同时查询时导致问题。 – Pacerier 2015-05-04 08:14:16

1

是的,这可能令人沮丧。我通常使用的解决方案涉及使用更复杂的查询或使用更多临时表来避免临时表。

简单的复制(但像你提到的,这是没有用的,你)

CREATE TEMPORARY TABLE preselectionCopy AS 
SELECT * FROM preselection; 

或临时表来保存你的结果

CREATE TEMPORARY TABLE result (
    id INT NULL, 
    title VARCHAR(256) NULL 
    ... 
    ); 

...它可以是一样简单

CREATE TEMPORARY TABLE result AS 
SELECT * FROM preselection WHERE snid=1 AND chapter LIKE '#A_OT%' 
LIMIT 4; 

INSERT INTO result 
SELECT * FROM preselection WHERE snid=19 AND chapter LIKE '#A_OT%' 
LIMIT 4; 

... 

SELECT * FROM result 
ORDER BY `score` DESC, `date`; 
相关问题