我想知道为什么这些陈述不一样(第一个对我有用)
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。
有人可以解释为什么第二个陈述不起作用?因为我认为它会。
答案 0 :(得分:1)
假设你没有返回任何行(你没有真正说出是的问题,所以我在这里猜测一下),我首先想到的是没有行users
其中id
等于$user_id
。
这是两个SQL段之间的基本区别,第二个是user_thread_map
,threads
和users
表的交叉连接。第一个根本没有加入users
,所以这就是我要找问题的地方。
您的user_thread_map
表似乎是users
和threads
之间的多对多关系。如果是这样,您确定该表中的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
中的相关记录,则第二个查询只返回一些内容。