2013-02-18 58 views
0

我有一个多语言的网站,并使用该工具来获取用户使用的语言:使用if/else语句中的SQL查询

$languagestring = array(); 
$res1 = "SELECT id, text FROM ".$prefix."_language WHERE lang = 'en' ORDER BY id ASC"; 
if($result1 = $mysqli->query($res1)){ 
    while($row1 = $result1->fetch_object()){ 
     $langid = $row1->id; 

     $res = "SELECT text FROM ".$prefix."_language WHERE fk_id = $langid AND lang = '$language'"; 
     if($result = $mysqli->query($res)){ 
      $row = $result->fetch_object(); 
      if(!$row){ 
       $languagestring[] = $row1->text; 
      } else { 
       $str = $row->text; 
       $languagestring[] = $str; 
      } 
     } 
    } 
} 

在这个剧本我第一次得到了默认的英语,然后我检查查看用户偏好的语言是否有匹配英文字符串的字符串。这种方式很有魅力,但执行时间很长。是否有可能将这两个查询合并为一个,如果是的话......如何?

$res1 = "SELECT t1.text as etext, t2.text 
FROM ".$prefix."_language t1 LEFT JOIN ".$prefix."_language t2 ON t2.fk_id = t1.id AND lang = 'da'"; 
if($result1 = $mysqli->query($res1)){ 
    while($row1 = $result1->fetch_object()){ 
     $row1->text.'<br>'; 
    } 
} 

它不reurn任何结果:

在此先感谢;-)

########编辑

没有运气尝试这样做?

+0

这不会是导致大部分长时间执行的原因,而只是选择所需的列而不是所有的'*'都会节省一些时间。 – 2013-02-18 10:53:11

+0

我认为你的查询很小,不能慢!你创建了你的表的任何索引?有可能是错的! – 2013-02-18 10:57:47

+0

我已经索引了lang,fk_id并且仍然能够执行超过3秒的执行时间? – Mansa 2013-02-18 11:16:53

回答

0
SELECT t1.text as etext, t2.text 
FROM language t1 LEFT JOIN language t2 ON t2.fk_id=t1.id AND lang = '$language' 

或类似的东西。
主要想法是将LEFT JOIN英语部分添加到另一个语言部分。它会返回2个文本或只有英文版

+0

试过你的建议ut没有运气? (查看编辑后的文章) – Mansa 2013-02-18 11:47:54

-1

那么使用UNION和子查询的解决方案可以工作,但如果考虑加载时间可能不是最好的选择。

"(select text from ".$prefix."_language where lang = '$langid') 
union 
(select text from ".$prefix."_language where lang = 'en' and fk_id not in (select fk_id from ".$prefix."_language where lang = '$langid'))"; 
+0

那么投票是好的。但至少应该给予评论,所以答案可以改进。 – 2013-02-18 13:38:35