无论我使用左外连接还是右外连接,外连接似乎都不起作用:
SELECT * FROM `event_orchestra_musicians` eom
right outer join `orchestra_instruments` oi on eom.instrument_id = oi.oi_id
where event_id = 2
order by instrument_id
Orchestra_instruments 包含具有唯一 ID 的不同乐器,即:
- fiddle
- 中提琴
- 竖琴
- 短笛
Event_Orchestra_Musicians 是一个将音乐家与乐器连接起来的查找表,即:
musician_id, instrument_id, event_id,
1 1 2
2 1 2
3 3 2
4 2 2
当我使用这些表中的数据进行任何外部联接时,我会得到内部联接的结果(Piccolo 不会显示空的音乐家 ID,它根本不会显示)。我是不是做错了什么?
编辑:
所以我做了一些胡闹。问题似乎是因为 events_orchestra_musicians 表中有一条记录,其 event_id 为 5,instrument_id 为 7。如果我删除该记录,则外连接有效。我不明白的是,如果该记录在那里,并且我使用 where 子句来查找 event_id = 2,那么如果其中有一条 Instrument_id 为 7 的记录(如果其 event_id 为 5),那么为什么它很重要?
最佳答案
试试这个:
select oi.oi_id, oi.instrument_name, eom.musician_id
from orchestra_instruments oi
left join event_orchestra_musicians eom on oi.oi_id = eom.instrument_id
where (eom.event_id = 2 or eom.event_id is null)
order by oi.oi_id
您必须使用 Orchestra_instruments 作为基表,因为这是您想要所有记录的表,即使不存在音乐家也是如此。我无法想象使用右连接而不是左连接的任何原因,并且隐含了外部连接。另外,您必须允许 event_id 为 2 或 null,因为如果没有匹配的记录要加入,则它不能为 2。
关于mysql - MYSQL 中的右外连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9131862/