2013-10-29 7 views
5

मेरा प्रश्न MySQL अनुकूलन और अच्छी प्रैक्टिस के बारे में है।MySQL: FIELD/GROUP द्वारा आदेश

मुझे ऑर्डर वरीयता के साथ अनुवादित टेक्स्ट सूची प्राप्त करनी है: यदि मुझे अंग्रेजी में टेक्स्ट नहीं मिल रहा है, तो मैं फ्रेंच टेक्स्ट का उपयोग करना चाहता हूं और यदि यह अस्तित्व में नहीं है, तो मैं स्पेनिश का उपयोग करना चाहता हूं।

दूसरे शब्दों में, मेरे पास है:

id lang text 
1 fr text_FR 
1 en text_EN 
1 es text_ES 
2 fr text_FR2 
3 fr text_FR3 
3 es text_ES3 

और मैं चाहता हूँ:

id lang text 
1 en text_EN 
2 fr text_FR2 
3 fr text_FR3 

तो मैं this, this, that, या that जैसे कुछ विषयों को पढ़ने के। ठीक। मैंने कोशिश की यह:

SELECT text FROM (
    SELECT id, text 
    FROM translation 
    ORDER BY FIELD(lang, 'en', 'fr', 'es') 
) tt GROUP BY tt.id; 

लेकिन, जब मैं इस क्वेरी व्याख्या, मैं पढ़ सकते हैं:

id select_type table partitions type possible_keys key key_len ref rows Extra 
1 PRIMARY <derived2> NULL ALL NULL NULL NULL NULL 4 Using temporary; Using filesort 
2 DERIVED translation NULL ALL PRIMARY PRIMARY 52  1641  Using filesort 

तो यह सबक्वेरी की वजह से अनुकूल नहीं है,। क्या मैं इस सबक्वायरी से बच सकता हूं?

उत्तर

2

मैं प्रत्येक भाषा के लिए id द्वारा तालिका पर JOIN आईएनजी का सुझाव दूंगा। आप नल परिणामों की अनुमति देने के लिए LEFT JOIN का उपयोग कर सकते हैं। क्वेरी अभी भी अस्थायी/फाइलॉर्ट का उपयोग करेगी क्योंकि इसे पूरी तालिका को स्कैन करना है (आप इसे अधिक सीमित करने के लिए WHERE का उपयोग कर सकते हैं), लेकिन केवल पहली तालिका के लिए। जुड़ने वाली टेबल पर लुकअप त्वरित होना चाहिए।

SELECT 
    COALESCE(en.text, fr.text, es.text, any.text) 
FROM 
    f any 
    LEFT JOIN f en ON (any.id = en.id AND en.lang = 'en') 
    LEFT JOIN f fr ON (any.id = fr.id AND fr.lang = 'fr') 
    LEFT JOIN f es ON (any.id = es.id AND es.lang = 'es') 
GROUP BY any.id; 

http://sqlfiddle.com/#!2/baafc/1

+0

दिलचस्प, 'COALESCE' के बारे में पता नहीं था! – xiankai

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