选择在另一个表

时间:2017-06-19 19:29:09

标签: mysql select join inner-join

所以我需要列出人员表中的所有人。每行都有office_id,当有人被分配到办公室时,它包含一个大于0的值,我需要在office表中查找以获取分配给该人的办公室的名称。但是当我使用INNER JOIN时,它会忽略office_id = 0

所在的记录
SELECT * 
FROM personnel 
WHERE building_id=$SESSION[building_id] 
ORDER BY last_name 
INNER JOIN offices 
WHERE offices.office_id=personnel.office_id

现在,它给了我所有拥有指定办公室的人,却忽略了那些没有任职的人(吉尔)。如何让它们全部显示如下:

Jack Building1 Office1<br>
John Building1 Office2<br>
Jill Building1 <br>
Judy Building1 Office3<br>
Jenn Building1 Office4<br>

2 个答案:

答案 0 :(得分:2)

我安排了SQL以获得正确的语句顺序,并注释了其他语句的使用位置,并将WHERE切换为LEFT连接的on子句,其中包括所有人员和仅匹配的办事处中的那些记录。 / p>

SELECT * 
FROM personnel p
LEFT JOIN offices  o
  ON  o.office_id=p.office_id
-- and o.building_id=$SESSION[building_id] --this if building is in offices. and eliminate next
WHERE building_id=$SESSION[building_id] 
--  GROUP BY
--  HAVING
ORDER BY p.last_name 
--  LIMIT

注意当使用多个表时,明智的做法是对所涉及的表进行别名 完全限定字段,因此哪个列来自哪个表没有歧义。

这在此非常重要,因为:building_Id是什么表?

如果是办公室,那么我们可能必须从整体上删除where子句并且有一个&#34; AND&#34;在加入。否则,where子句将取消左连接,使其行为类似于内连接。

为什么......首先为某些人员创建具有NULL building_ID的办公室。然后where子句运行消除NULL记录,因为它们不匹配$ Session [Building_ID]。所以如果建筑物在办公室桌子上,我们只是让左连接成为内部。

现在如果建筑物在人员桌上......那么它就不重要了,把它放在where子句中就可以了。

答案 1 :(得分:0)

对于您的任务,您应该使用LEFT JOIN,它将返回下表。 LEFT JOIN在左边(人员)处理什么,并在右边(办公室)加入什么,如果左边的表中没有记录对,那么它将返回Null,其中值将丢失。 / p>

SELECT * 
FROM personnel 
LEFT JOIN offices ON offices.office_id=personnel.office_id 
WHERE building_id=$SESSION[building_id] 
ORDER BY last_name

|Jack | Building1 | Office1
|John | Building1 | Office2
|Jill | Building1 | Null
|Judy | Building1 | Office3
|Jenn | Building1 | Office4

还要确保使用正确的SQL运算符序列:SELECT ... FROM ... [LEFT / RIGHT JOIN ... ON ...] WHERE ... GROUP BY ...