0

我的数据库中有几张表:

  1. user表:user_id (primary key), first_name, last_name, email_address.
  2. inst表:inst_id (primary key)inst_nametype
  3. user_insts表:user_insts_id (primary key)user_insts_statusinst_name (foreign key)user_id(foreign key)

我在我的网站上使用它,我需要它来显示表格inst_name列中的所有条目inst,但只有右侧某个 id 的条目,否则显示为空。我已经尝试了如下几件事:

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';

任何帮助将不胜感激。

编辑::

这是我目前得到的:

 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
4

3 回答 3

1

您的原始查询将做的是从表中获取所有行,然后查看inst表中是否有匹配的行。如果有,它将返回该表中的数据。否则它将返回 NULL。如果将 JOIN 更改为 INNER JOIN,则它将仅返回右侧匹配的行。像这样:inst_nameuser_insts

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

于 2012-04-20T06:05:24.380 回答
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'
于 2012-04-20T05:55:29.547 回答
0

您提供的查询是否显示以下结果?

  1. 查询 1:显示所有inst+user_insts条目,但未过滤user_id
  2. 查询 2:仅显示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内容。

于 2012-04-20T06:04:27.403 回答