带连接和子查询的Mysql搜索查询

时间:2013-07-18 01:50:39

标签: mysql rdbms database

我有一个与php平台连接的大型Mysql数据库。

我的桌子很少有这个结构:

表用户:

id (int auto increment not null, primary key)
name (varchar 200)
spoken_lang (varchar 400) /* The value of this field is the id of the table languages, 
                             with the char ';' like a separator ;*/

表格语言

id (int auto increment not null, primary key) /* Used also in the prev table */
name (varchar 200)

是否可以制作一个能够比较列user.name以及表languages.name?

的搜索查询

这样的事情:

SELECT user.name, languages.name as lang 
FROM 
user JOIN languages ON user.spoken_lang = ......  

2 个答案:

答案 0 :(得分:1)

您可以使用like作为join条件执行此操作:

select u.name, l.name as lang
from user u join
     languages l
     on concat(';', u.spoken_lang, ';') like concat('%;', l.name, ';%')

我们的想法是将分隔符(';')添加到每种语言的开头和结尾。然后搜索口语就像语言的情况。例如,如果您有'English;Spanish;Russian',那么它将比较为:

';English;Spanish;Russian;' like '%;Russian;%'

找一场比赛。您不必担心部分匹配,因为分号会分隔每种语言。

在MySQL中,您也可以使用find_in_set()执行此操作,但这需要用逗号替换分号:

on find_in_set(l.lang, replace(u.spoken_lang, ';', ',')

答案 1 :(得分:1)

我首先要建议你规范化你的表 - 你不应该在一列中存储结果列表。如果可能,请考虑创建一个存储User_LanguageUser_Id的{​​{1}}表。

但是,您可以使用Language_IdFIND_IN_SET

获得相同的结果
REPLACE