我想将此代码转换为更纯粹的MySQL。此代码根据$ words中的每个单词获取一行,并创建$翻译的单词数组。
$words = array("word1","word2","word3"...);
$translated = array();
foreach($words as $word){
$query = "
select * from (
select text1,text2,text3
from table1
union
select text1,text2,text3
from table2
union
select text1,text2,text3
from table3
) as u
where u.text1 = ? or u.text2 = ?";
$prepare = $database -> prepare($query);
$prepare -> execute(array($word,$word));
$fetch = $prepare -> fetch();
if($fetch["text3"]){ $push = $fetch["text3"]; }
else if($fetch["text1"]){ $push = $fetch["text1"]; }
else{ $push = $word; }
array_push($translated, $push);
}
这个PHP解决方案对我来说似乎效率低下。我想找到一个纯粹的MySQL解决方案。到目前为止,我一直在研究这个MySQL,但它没有结束逻辑。
$query="
select
if(text2='word1',text3,0) as W1,
+ if(text2='word2',text3,0) as W2,
+ if(text2='word3',text3,0) as W3,
...
from (
select text1,text2,text3
from table1
union
select text1,text2,text3
from table2
union
select text1,text2,text3
from table3
) as u where
u.text1 in('word1','word2','word3'...) or
u.text3 in('word1','word2','word3'...)
";
这给出了类似的东西:
Array (
[0] => Array ( [word1] => 0 [word2] => word22 [word3] => 0 [word4] => 0 )
[1] => Array ( [word1] => word23 [word2] => 0 [word3] => 0 [word4] => 0 )
[2] => Array ( [word1] => 0 [word2] => 0 [word3] => word24 [word4] => 0 ) )
我可以列搜索非零条目以查找翻译。但是,如果缺少text3,我不知道如何向MySQL添加逻辑以选择默认text1。
if($fetch["text3"]){ $push = $fetch["text3"]; }
else if($fetch["text1"]){ $push = $fetch["text1"]; }
else{ $push = $word; }
array_push($translated, $push);
答案 0 :(得分:2)
你可以很容易地将至少一些默认逻辑工作到当前的“更纯粹的SQL”示例中(我假设最终需要在PHP中进行相当多的循环)。您没有指定text3
在“缺失”时的内容,但以下内容适用于null
或空字符串
if(text2='word1', IF(CHAR_LENGTH(text3), text3, text1), 0) as W1
如果'missing'可靠地表示null
和text1
的{{1}},那么PHP的整个默认值逻辑可以表示为
text3
我不能说我是这个解决方案的忠实粉丝,但遗憾的是我还没有为你提出一个只有你的SQL子弹。为了优化,我也不是优化的倡导者。你还没有说明if(text2='word1', COALESCE(text3, text1, 'word1'), 0) as W1
数组可能有多大,但如果你的软件的这一部分对你的性能影响不大,花在“修复”上的时间可能会更好地花在其他地方。
通过将SQL语句准备移出$words
循环,可以稍微改善原始方法中最明显的低效率;它不需要重复进行。
您也可以通过调整上面的CHAR_LENGTH或COALESCE建议,将默认值逻辑运用到原始方法的SQL中(尽管我不能说它是否会真正提高性能)。
的内容foreach