我的数据库中有几张表:
user
表:user_id (primary key)
,first_name
,last_name
,email_address
。inst
表:inst_id (primary key)
,inst_name
和type
。- 醇>
user_insts
表:user_insts_id (primary key)
,user_insts_status
,inst_name (foreign key)
和user_id(foreign key)
。
我在我的网站上使用此功能,我需要它来显示inst_name
表的inst
列中的所有内容,但只显示右侧某个ID的所有内容或者显示为null。我尝试过以下几件事:
SELECT inst.inst_name,inst.inst_id,user_insts.user_id,user_insts.inst_name
FROM inst LEFT JOIN user_insts ON inst.inst_name=user_insts.inst_name;
SELECT inst.inst_name,inst.inst_id,user_insts.user_id,user_insts.inst_name
FROM inst LEFT JOIN user_insts ON inst.inst_name=user_insts.inst_name
WHERE user_insts.user_id='11';
非常感谢任何帮助。
EDIT ::
这是我目前得到的:
inst_name inst_id user_id:
ASB 1 11
BNZ 3 11
FMG 5 11
我希望能够得到更像这样的东西:
inst_name inst_id user_id:
ASB 1 11
ANZ 2 NULL
BNZ 3 11
paymark 4 NULL
FMG 5 11
STATE 6 NULL
答案 0 :(得分:1)
您的原始查询将执行的操作是从inst
表中获取所有行,然后查看在inst_name
表中是否存在与user_insts
匹配的行。如果有,它将返回该表中的数据。否则它将返回NULL。如果将JOIN更改为INNER JOIN,则它将仅返回右侧匹配的行。像这样:
SELECT inst.inst_name,inst.inst_id,user_insts.user_id,user_insts.inst_name
FROM inst INNER JOIN user_insts ON inst.inst_name=user_insts.inst_name
WHERE user_insts.user_id='11';
但你应该考虑改变你的架构。您在inst
上有一个整数主键,因此您应该使用inst_name
作为inst_name
上的外键。
答案 1 :(得分:0)
您的问题不是100%明确,所以我假设您要为每个用户显示inst_name;当inst条目不存在时,将inst_name显示为null。
这样的事情应该有效:
select u.user_id, i.inst_name
from user u
left join user_insts ui on ui.user_id = u.user_id
left join inst i on i.inst_name = ui.inst_name
您可以通过添加
来限制user_id的结果where u.user_id = '11'
答案 2 :(得分:0)
您提供的查询是否显示以下结果?
inst
+ user_insts
条目,但未经user_id
inst
user_insts
+ user_id
条目
醇>
查询2中发生的事情是where
子句在连接后加入表格。我想你想要发生的事情是首先按照特定的user_insts
过滤结果的右侧(user_id
),如下所示:
SELECT ui.inst_name, ui.user_id FROM user_insts ui WHERE ui.user_id = :PARAM
然后,您想要在过滤器之后使用inst
表中的所有条目LEFT JOIN。您可以使用内部视图,以便在实际加入user_id
表之前先按inst
进行过滤。生成的查询应该是这样的:
SELECT i.inst_name, filtered_ui.user_id
FROM inst i
LEFT JOIN (SELECT ui.inst_name, ui.user_id
FROM user_insts ui
WHERE ui.user_id = :PARAM) filtered_ui
ON i.inst_name = filtered_ui.inst_name
考虑更多,我对MySQL不太熟悉,所以我不确定这个替代查询是否是有效的语法:
SELECT i.inst_name, ui.user_id
FROM inst i
LEFT JOIN user_insts ui ON i.inst_name = ui.inst_name AND ui.user_id = :PARAM
......这可能比内部视图更简单。
重点是你必须在加入前先进行过滤,以便显示所有inst_names
。