2012-02-20 12 views
5

MySQL दस्तावेज़ कहते हैं: "आप एक ही क्वेरी में एक से अधिक बार एक टेम्पलेट तालिका का उल्लेख नहीं कर सकते हैं।"मैं एक ही प्रश्न में एक से अधिक बार एक टेम्पलेट तालिका का संदर्भ कैसे दे सकता हूं?

मुझे पता है कि इससे पहले पूछा गया है। लेकिन मुझे निम्नलिखित के लिए एक विशिष्ट समाधान नहीं मिल रहा है।

मैं एक अस्थायी तालिका में एक प्रारंभिक चुनाव कर रहा हूँ

CREATE TEMPORARY TABLE preselection AS SELECT ...; 

अब मैं कुछ

(20 के आसपास या यहाँ तक कि 30) यूनियनों

(SELECT FROM preselection ...) 
UNION 
(SELECT FROM preselection ...) 
UNION 
...... 
UNION 
(SELECT FROM preselection ...) 
क्या करना चाहते मैं प्रारंभिक चुनाव के 20 या 30 प्रतियां बना सकता है और प्रत्येक तालिका पर प्रत्येक का चयन करें, लेकिन यदि मैं इसे समझता हूं तो यह समान है कि उपरोक्त के रूप में यूनियन श्रृंखला के अंदर प्रत्येक चयन में उपरोक्त पूर्व-चयन-क्वेरी का आह्वान करें।

क्या इस मुद्दे के आसपास काम करने का कोई तरीका है?

नमस्ते,

क्रिस

पूर्ण क्वेरी:

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

संभव डुप्लिकेट [माइस्क्ल में एक अस्थायी तालिका तक कई बार एक्सेस करना] (http://stackoverflow.com/questions/4078873/accessing-a - समकालीन-टेबल-बहु-बार-इन-माइस्क्ल) –

+1

क्या आप पूर्ण, वास्तविक क्वेरी दिखा सकते हैं? यह हमें ऐसे कामकाज के लिए विचारों के साथ आने में मदद कर सकता है, जिसमें temp तालिका को कई बार जोड़ने की आवश्यकता नहीं होती है। – JohnFx

+0

शायद यह एक अच्छा विचार है। यहां मेरी पूरी क्वेरी है, मुझे वास्तव में यह नहीं पता कि इसे अलग तरीके से कैसे किया जाए। (पोस्ट में जोड़ा गया) –

उत्तर

4

मुझे लगता है कि त्रुटि संदेश स्पष्ट है: आप एक ही अस्थायी तालिका के साथ क्या है कि नहीं कर सकते। अस्थायी तालिकाओं की बजाय डेटा का एक दृश्य बनाते हुए, चाल करें?

Views in mysql

+0

मैं कई अलग-अलग समस्याओं के लिए हर समय यह "चाल" करता हूं। उपयोग करने के लिए यह एक अच्छी आदत है। – northpole

+0

@ मॉस्टी, विचारों के साथ समस्या यह है कि वे वैश्विक हैं। सत्र-स्थानीय "अस्थायी विचार" बनाने का कोई तरीका नहीं प्रतीत होता है। कई समस्याएं होने पर इससे समस्याएं पैदा हो जाएंगी। – Pacerier

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`; 
संबंधित मुद्दे

 संबंधित मुद्दे