1

我有一个与 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 和表 language.name 的单个搜索查询?

像这样的东西:

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

2 回答 2

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, ';', ',')
于 2013-07-18T01:59:31.337 回答
1

我首先必须建议您对表格进行规范化——您不应该将结果列表存储在单个列中。如果可能,考虑创建一个User_Language存储User_Id和 的表Language_Id

但是,您可以使用FIND_IN_SETand获得相同的结果REPLACE

select u.name, l.name language
from user u
  join languages l on find_in_set(l.id, replace(u.spoken_lang,';',','))
于 2013-07-18T01:59:39.287 回答