我正在尝试使用如下所示的查询来联接一些表。因为我想理想地得到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总是把c和a.c_id = c.id结合起来,得到不太受欢迎的c.name。有没有可能避免这种情况,或者mySQL正在试图尽可能快地获得完整的结果集?
发布于 2016-09-13 23:21:09
我认为这应该会有帮助:
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将为您提供所有可能的结果行,包括a中每一行的b.c_id和a.c_id映射。
如果您不熟悉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)发布于 2016-09-13 23:26:24
试试这个可能会有帮助:
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.idhttps://stackoverflow.com/questions/39473460
复制相似问题