前一段时间在做一个关于多语言翻译需求的时候,遇到了一个关于查询的问题,怎么查询出一条记录的韩语已翻译,或者这条记录的韩语还未翻译,当时想的那肯定是要连表查询了,但我们组长一般是不允许我们连表查询的,除非表的记录很少。不连表,那怎么查询呢?后来经由同事知道了MySQL里面的find_in_set这个操作。
主表结构:
id name languages
存储的翻译的内容当然就在另外一个表了,这里就不多说了,这里的languages字段就存储的已经翻译的各种预言的简称,用逗号‘,’隔开,比如:
1 你好 en,fr,ko
2 早上好 en,ja
有可能有的人第一想法想到的是mysql的value in('a','b','c');这样的查询,但其实是不可以的,因为如果括号()里面的字符是固定不变的话,也可以查询,但现在这里是固定的表字段languages这个字段,里面的内容是变化的,mysql里面in是不支持这样的查询的,所以我们应选择find_in_set(),我们来看看这个操作:
SELECT * FROM table WHERE find_in_set('ja',languages)>=1;
$search代表要查询的语言,languages代表是表字段,即查找字段languages含有‘ja’字符的记录,也即是查找出被'ja'语言翻译过得记录,同样也可以查找出没有翻译的记录,即find_in_set()找不到字符串则返回0,可以这样写:
SELECT * FROM table WHERE find_in_set('ja',languages)=0;
这样就可以查找出ja语言还没翻译的记录,给翻译人员进行翻译。