我有一个与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 = ......
答案 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_Language
和User_Id
的{{1}}表。
但是,您可以使用Language_Id
和FIND_IN_SET
:
REPLACE