2011-02-21 19 views
5

मुझे निम्न स्थिति का सामना करना पड़ रहा है।MySQL डेटाबेस पर जटिल सॉर्टिंग

हमारे पास अनुवाद के साथ एक इकाई के साथ एक सीएमएस है। ये अनुवाद एक अलग-अलग टेबल में एक-से-कई रिश्ते के साथ संग्रहीत किए जाते हैं। उदाहरण के लिए newsarticles और newsarticle_translations। उपलब्ध languages की मात्रा उसी सीएमएस द्वारा गतिशील रूप से निर्धारित की जाती है।

एक नया न्यूजर्टिकल दर्ज करते समय संपादक को कम से कम एक अनुवाद दर्ज करना होगा, जो उपलब्ध भाषाओं में से एक वह है।

हमारे सीएमएस में न्यूजर्टिकल अवलोकन में हम (अनुवादित) लेख शीर्षक के साथ एक स्तंभ दिखाना चाहते हैं, लेकिन चूंकि कोई भी भाषा अनिवार्य नहीं है (उनमें से एक अनिवार्य है लेकिन मुझे नहीं पता कि मैं कौन सा हूं) वास्तव में नहीं जानते कि दर्ज की गई भाषा के बावजूद प्रत्येक न्यूज़र्टिकल के लिए शीर्षक चुनने के लिए मेरी mysql क्वेरी कैसे बनाएं।

और इसे सब कुछ कठिन बनाने के लिए, हमारे प्रबंधक ने शीर्षक पर सॉर्ट करने में सक्षम होने की संभावना के लिए कहा, इसलिए एक अलग क्वेरी में अनुवाद लाने से मुझे पता चला है।

किसी को भी इस बात का कोई विचार है कि इसे सबसे कुशल तरीके से कैसे हल किया जाए?

यहाँ मेरी मेज स्कीमा का यह

> desc news; 
+-----------------+----------------+------+-----+-------------------+----------------+ 
| Field   | Type   | Null | Key | Default   | Extra   | 
+-----------------+----------------+------+-----+-------------------+----------------+ 
| id    | int(10)  | NO | PRI | NULL    | auto_increment | 
| category_id  | int(1)   | YES |  | NULL    |    | 
| created   | timestamp  | NO |  | CURRENT_TIMESTAMP |    | 
| user_id   | int(10)  | YES |  | NULL    |    | 
+-----------------+----------------+------+-----+-------------------+----------------+ 


> desc news_translations; 
+-----------------+------------------+------+-----+---------+----------------+ 
| Field   | Type    | Null | Key | Default | Extra   | 
+-----------------+------------------+------+-----+---------+----------------+ 
| id    | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| enabled   | tinyint(1)  | NO |  | 0  |    | 
| news_id   | int(1) unsigned | NO |  | NULL |    | 
| title   | varchar(255)  | NO |  |   |    | 
| summary   | text    | YES |  | NULL |    | 
| body   | text    | NO |  | NULL |    | 
| language  | varchar(2)  | NO |  | NULL |    | 
+-----------------+------------------+------+-----+---------+----------------+ 

पुनश्च मदद कर सकता है कर रहे हैं: मैं हालांकि सबक्वेरी के बारे में है और संगठित() समाधान लेकिन उन बल्कि गंदा चाल लगते हैं, सोच अगर कुछ बेहतर जानते है कि मैं कर रहा हूँ सोच नहीं रहा?

+1

यह फ़ायदेमंद होगा भी एक 'तालिका में' news' title' क्षेत्र है जिसके लिए डिफ़ॉल्ट शीर्षक के रूप में इस्तेमाल किया जाएगा के लिए पर काम कर सकते एक समाचार लेख? भले ही इसका बैकएंड उपयोग के लिए? –

+0

ऐसा होगा लेकिन इस तरह की अनावश्यकता मेरा आखिरी उपाय होगा। मैं एक क्लीनर/बेहतर समाधान की तलाश में हूं, लेकिन सुझाव के लिए धन्यवाद। – ChrisR

+0

शायद एक बाएं जॉइन? – Benubird

उत्तर

1

यह एक तेज़ दृष्टिकोण नहीं है, लेकिन मुझे लगता है कि यह आपको वही देता है जो आप चाहते हैं।
मुझे पता है कि यह कैसे काम करता है, और हम गति अगले :)

select nt.title 
    from news n 
    join news_translations nt on(n.id = nt.news_id) 
where nt.title is not null 
    and nt.language = (
      select max(x.language) 
      from news_translations x 
      where x.title is not null 
      and x.new_id = nt.news_id) 
order 
    by nt.title; 
+0

धन्यवाद, यह मेरी ज़रूरत नहीं है, लेकिन यह सही समाधान खोजने के लिए मेरे रास्ते पर सेट है! – ChrisR

1

मान लीजिए कि मैंने आपकी समस्या को सही तरीके से पढ़ा है, तो आप "आवश्यक" भाषा पसंद करते हुए लेखों के लिए शीर्षक की एक सूची प्राप्त करना चाहते हैं? उस के लिए एक क्वेरी की तर्ज पर जा सकते हैं ...

SELECT * FROM (
    SELECT nt.`title`, nt.news_id 
    FROM news n 
     INNER JOIN news_translations nt ON (n.id = nt.news_id) 
    WHERE title != '' 
    ORDER BY 
     CASE 
      WHEN nt.language = 'en' THEN 3 
      WHEN nt.language = 'jp' THEN 2 
      WHEN nt.language = 'de' THEN 1 
      ELSE 0 END DESC 
) AS t1 
GROUP BY `news_id` 

यह उदाहरण एक दूसरी वरीयता के रूप में अंग्रेजी (en) यदि उपलब्ध हो, जापानी (JP) में एक शीर्षक पसंद है, और जर्मन (de) एक तिहाई के रूप में , लेकिन अनुरोधित भाषाओं में से कोई भी उपलब्ध नहीं होने पर पहली 'अन्य' प्रविष्टि प्रदर्शित करेगा।

+0

है, ऑर्डरिंग समस्या नहीं है, यह न्यूज़_ट्रांसलेशन तालिका से सही रिकॉर्ड चुन रहा है जिसमें एक शीर्षक दर्ज किया गया है। मैंने आपकी क्वेरी की कोशिश की है और अभी भी परिदृश्य है जब खाली शीर्षक लौटाया जाता है हालांकि संबंधित अनुवाद रिकॉर्ड में शीर्षकों में से एक दर्ज किया जाता है। – ChrisR

+2

ओह, मैं देखता हूं ... मुझे नहीं पता था कि वहां खाली रिक्त प्रविष्टियां होंगी। आप आंतरिक चयन के लिए "जहां शीर्षक! = ''/IS NOT NULL" जोड़कर संभावित रूप से हल कर सकते हैं। मुझे बताएं कि आप कैसे चलते हैं, या यदि मैं फिर से बिंदु याद कर चुका हूं :) –

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