SQL根据特定数据选择

时间:2012-04-20 05:32:04

标签: mysql sql database select join

我的数据库中有几张表:

  
      
  1. user表:user_id (primary key)first_namelast_nameemail_address
  2.   
  3. inst表:inst_id (primary key)inst_nametype
  4.   
  5. user_insts表:user_insts_id (primary key)user_insts_statusinst_name (foreign key)user_id(foreign key)
  6.   

我在我的网站上使用此功能,我需要它来显示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

3 个答案:

答案 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)

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

  1. 查询1:显示所有inst + user_insts条目,但未经user_id
  2. 过滤
  3. 查询2:仅显示按inst
  4. 过滤的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