关于链接表的SQL问题

时间:2010-01-03 11:44:41

标签: sql mysql

我想知道为什么这些陈述不一样(第一个对我有用)

AND user_thread_map.user_id = $user_id
AND user_thread_map.thread_id = threads.id

AND user_thread_map.user_id = users.id
AND user_thread_map.thread_id = threads.id
AND users.id = $user_id

他们不应该一样吗?在第二个中,我链接了前两行中的所有表,然后我告诉它选择users.id = $ user_id。

有人可以解释为什么第二个陈述不起作用?因为我认为它会。

2 个答案:

答案 0 :(得分:1)

假设你没有返回任何行(你没有真正说出的问题,所以我在这里猜测一下),我首先想到的是没有行users其中id等于$user_id

这是两个SQL段之间的基本区别,第二个是user_thread_mapthreadsusers表的交叉连接。第一个根本没有加入users,所以这就是我要找问题的地方。

您的user_thread_map表似乎是usersthreads之间的多对多关系。如果是这样,您确定该表中的ID字段与相应的其他表之间存在外键约束,例如:

users:
    id integer primary key
    name varchar(50)
threads:
    id integer primary key
    thread_text varchar(100)
user_thread_map:
    user_id integer references users(id)
    thread_id integer references threads(id)

如果您有这些外键约束,则最终不可能得到没有相应user_thread_map(user_id)值的users(id)值。

如果不存在这些约束,查询可以告诉您在立即添加约束之前需要修复哪些值(这对于防止问题再次发生非常重要),类似于:

select user_thread_map.user_id
from user_thread_map
left join users
on user_thread_map.user_id = users.id
where users.id is null

答案 1 :(得分:1)

第一个将从表user_thread_map中选择user_id = $user_id的记录,而不管表user中的记录是否与该ID一起存在。如果找到user中的相关记录,则第二个查询只返回一些内容。