2012-02-20 23 views
5

tài liệu MySQL nói: "Bạn không thể tham chiếu đến bảng TEMPORARY nhiều lần trong cùng một truy vấn".Làm thế nào tôi có thể tham chiếu đến một bảng TEMPORARY nhiều hơn một lần trong cùng một truy vấn?

Tôi biết điều này đã được yêu cầu trước đó. Nhưng tôi không thể tìm thấy một giải pháp cụ thể cho những điều sau đây.

tôi đang làm một sự chọn lọc trước vào một bảng tạm thời

CREATE TEMPORARY TABLE preselection AS SELECT ...; 

bây giờ tôi muốn làm một số (khoảng 20 hoặc thậm chí 30) công đoàn

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

tôi có thể làm cho 20 hoặc 30 bản sao của sự chọn lọc trước và làm mỗi lựa chọn trên mỗi bảng nhưng nếu tôi hiểu nó đúng này là giống như gọi truy vấn preselection ở trên trong mỗi SELECT bên trong chuỗi UNION như một truy vấn phụ.

Có cách nào giải quyết vấn đề này không?

Greetings,

chris

Full truy vấn:

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

có thể trùng lặp [Truy cập bảng tạm thời nhiều lần trong MySql] (http://stackoverflow.com/questions/4078873/accessing-a -temporary-table-multiple-times-in-mysql) –

+1

Bạn có thể hiển thị truy vấn đầy đủ, thực tế không? Nó có thể giúp chúng tôi đưa ra ý tưởng cho một workaround mà không yêu cầu thêm bảng tạm thời nhiều lần. – JohnFx

+0

Có lẽ đó là một ý tưởng hay. Đây là truy vấn đầy đủ của tôi, tôi thực sự không có ý tưởng làm thế nào để làm điều đó theo một cách khác. (THÊM VÀO BÀI ĐĂNG) –

Trả lời

4

Tôi nghĩ rằng các thông báo lỗi là rõ ràng: bạn không thể làm điều đó với một bảng tạm thời duy nhất. Không tạo ra một cái nhìn của dữ liệu, thay vì một bảng tạm thời, làm các trick?

Views in mysql

+0

Tôi làm điều này "lừa" tất cả thời gian cho nhiều vấn đề khác nhau. Đó là một thói quen tốt để làm quen. – northpole

+0

@Mosty, Vấn đề với quan điểm là chúng toàn cầu. Dường như không có cách nào để tạo "lượt xem tạm thời" theo phiên địa phương. Điều này sẽ gây ra vấn đề khi có nhiều truy vấn đồng thời. – Pacerier

1

Có thể gây phiền toái. Các giải pháp tôi thường sử dụng liên quan đến việc tránh bảng tạm thời với truy vấn phức tạp hơn hoặc sử dụng nhiều bảng tạm thời hơn.

Bản sao đơn giản (nhưng cũng giống như bạn đề cập đến điều này không sử dụng cho bạn)

CREATE TEMPORARY TABLE preselectionCopy AS 
SELECT * FROM preselection; 

Hoặc một bảng tạm thời để giữ kết quả của bạn

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

... mà có thể đơn giản như

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`; 
Các vấn đề liên quan