mysql 5.1.41中的1:n数据结构不起作用

mysql 5.1.41中的1:n数据结构不起作用,mysql,Mysql,我正在使用mysql 5.1.41解决一个问题,用户应该能够指定他说什么语言。这本不应该是一个问题,但事实确实如此。 我想到了这样一个结构: CREATE TABLE `user2lang` ( `id` int(11) NOT NULL auto_increment, `user` int(11) NOT NULL, `lang` int(11) NOT NULL, PRIMARY KEY (`id`) ) 还有第二张桌子 CREATE TABLE `lang` (

我正在使用mysql 5.1.41解决一个问题,用户应该能够指定他说什么语言。这本不应该是一个问题,但事实确实如此。
我想到了这样一个结构:

CREATE TABLE `user2lang` (
  `id` int(11) NOT NULL auto_increment,
  `user` int(11) NOT NULL,
  `lang` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) 
还有第二张桌子

CREATE TABLE `lang` (
  `id` int(11) NOT NULL auto_increment,
  `langname` varchar(50) NOT NULL,
  PRIMARY KEY  (`id`)
)
表中列出了可供选择的语言,例如:

id : langname 
1  : eng
2  : ger
3  : lat
在表中,我存储哪个用户使用什么语言的id

id : user : lang
1  : 1 : 1 (eng)
2  : 1 : 3 (lat)
3  : 2 : 2 (ger)
4  : 2 : 1 (eng)
现在我想获取所有可用语言的列表,如果某个特殊用户(user#2)能够说它,则应将其标记。
最明显的应该是左连接:

SELECT user2lang.lang,user2lang.user
FROM `user2lang` left join lang on
lang.id = user2lang.lang where
user2lang.user=2
SELECT lang.id ,user2lang.user
FROM `lang` left join `user2lang` on
lang.id = user2lang.lang where
user2lang.user=2
我得到的只是语言,用户2会说,如果用户2会说,则不是所有带有信息的语言。我正在寻找类似于:

lang : user 
1    : 2 
2    : 2 
3    : - or NUll or whatever 
4    : -

转动左连接,使表
lang
位于左连接的左侧:

SELECT user2lang.lang,user2lang.user
FROM `user2lang` left join lang on
lang.id = user2lang.lang where
user2lang.user=2
SELECT lang.id ,user2lang.user
FROM `lang` left join `user2lang` on
lang.id = user2lang.lang where
user2lang.user=2

编辑

1--您需要确保投影是从
lang
表中提取
lang
值,而不是从
user2lang
中提取值。所以应该是:
选择lang.id,user2lang.user
而不是
选择user2lang.lang,user2lang.user

2--如果希望显示所有语言,则必须在where子句中包含
或user2lang.user为NULL
。像这样:

SELECT lang.id, lang.langname, user2lang.user 
FROM lang left join user2lang 
  ON user2lang.lang=lang.id 
WHERE user2lang.user=2 or user2lang.user is null;

编辑(再次)

虽然上面的代码示例确实有效-@iliyan,但实际上有正确的答案。限制
user2lang.user=2
应该进入
ON
子句。进行查询:

SELECT lang.id, lang.langname, user2lang.user 
FROM lang left join user2lang 
  ON user2lang.lang=lang.id AND user2lang.user=2;

这是一种比包含我上面建议的
is null
位好得多的方法。

只要更改join子句,它就会工作:

SELECT lang.id ,user2lang.user
FROM `lang` left join `user2lang` on
lang.id = user2lang.lang AND user2lang.user=2

就我个人而言,我会将您的设计更改为以下设计,即删除user2lang表中不必要的代理主键,从而更好地加强数据完整性(不包括RI):


我试过了,但只有当我省略了语句中的“where user=2”部分时,它才起作用。如果没有where部分,我可以获得所有语言以及任何用户所说的信息。