在 sql 查询中使用 if/else
Posted
技术标签:
【中文标题】在 sql 查询中使用 if/else【英文标题】:Using if/else within sql query 【发布时间】:2013-02-18 10:50:37 【问题描述】:我有一个多语言网站,并且正在使用它来获取用户使用的语言:
$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;
在此脚本中,我首先获取默认的英语语言,然后检查用户首选语言是否有与英语匹配的字符串。这就像一个魅力,但执行时间很长。是否可以将这 2 个查询合并为一个,如果可以...如何?
提前致谢 ;-)
######## 编辑试过了,没有运气:
$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>';
它不会返回任何结果?
【问题讨论】:
这不会是导致大部分长时间执行的原因,但只选择您需要的列而不是所有*
将节省一些时间。
我觉得你的查询很小,一定不能慢!!!你为你的表创建了任何索引吗?可能有问题!
我已经为 lang、fk_id 编制了索引,但执行时间仍然超过 3 秒?
【参考方案1】:
SELECT t1.text as etext, t2.text
FROM language t1 LEFT JOIN language t2 ON t2.fk_id=t1.id AND lang = '$language'
或类似的东西。 主要思想是将英语部分左连接到另一种语言部分。它将返回 2 个文本或仅返回一个英文文本
【讨论】:
【参考方案2】:使用 UNION 和 Sub-Query 的解决方案可以工作,但如果考虑加载时间,可能不是最佳选择。
"( 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' ))";
【讨论】:
投反对票没问题。但至少应该给出评论,这样可以改进答案。以上是关于在 sql 查询中使用 if/else的主要内容,如果未能解决你的问题,请参考以下文章
如何在 BigQuery 的新 SQL 查询中连接/使用已保存的查询