我尝试使用下面的查询加入某些表格。因为我希望理想地获得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是否试图尽快获得完整的结果集?
答案 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_id
和a
映射。
如果您不熟悉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