订购左连接的子句

时间:2016-09-13 15:12:10

标签: mysql

我尝试使用下面的查询加入某些表格。因为我希望理想地获得b表引用的c.name。如果b表中的结果集中没有行,或者b行没有引用c,那么只需获取表引用的c.name。

SELECT a.*, c.name
FROM a
LEFT JOIN b ON a.b_id = b.id
LEFT JOIN c ON (b.c_id IS NOT NULL AND b.c_id = c.id) OR a.c_id = c.id

然而,mysql始终与a.c_id = c.id加入c并获得不太受欢迎的c.name。是否有可能避免这种情况,或者mySQL是否试图尽快获得完整的结果集?

2 个答案:

答案 0 :(得分:0)

我认为这应该有所帮助:

SELECT a.*, c.name
FROM a
LEFT JOIN b ON a.b_id = b.id
LEFT JOIN c ON c.id = COALESCE(b.c_id, a.c_id)

b.c_id为NULL时,将使用a.c_id。否则将使用b.c_id

不是关于速度。 OR将为您提供所有可能的结果行,包括b.c_id中每行的a.c_ida映射。

如果您不熟悉COALESCE(),则其长形式与您的查询完全相同,但使用IF()代替OR

SELECT a.*, c.name
FROM a
LEFT JOIN b ON a.b_id = b.id
LEFT JOIN c ON IF(b.c_id IS NOT NULL, b.c_id = c.id, a.c_id = c.id)

答案 1 :(得分:0)

尝试这可能有所帮助:

SELECT a.*, c.name
FROM a
LEFT JOIN b ON a.b_id = b.id
LEFT JOIN c ON (b.c_id IS NOT NULL OR b.c_id = c.id) OR a.c_id = c.id