用连接简化mysql查询

时间:2014-08-07 09:56:12

标签: mysql join

我正在处理其他一些开发人员代码,需要简化此查询,其格式如下。

SELECT
    table1.id, table2.userid, table4.groupid
FROM 
    table1, table2, table3, table4
WHERE
    userid = table4_userid
and 
    table2.id = table3.table2_id 
and 
    table1.table3_id = table3.id 
and 
    table3.statement_id = 264803 
order by table4_groupid

但是我习惯通过明确提到连接类型来加入查询,即LEFT,RIGHT或OUTER join。我还使用TableName.TableField,以便我知道哪个字段来自哪个表。但是,正如你在上面看到的那样,tablename.tablefield和tablefield只是混合了一下。上面的查询工作正常,但我需要将table4作为LEFT JOIN,这样如果table4中没有任何匹配的行,它仍然应该显示一些数据。

我的问题是:

1)上面有哪些类型的连接?

2)如何更改上述查询以使table4成为LEFT JOIN?

我知道你可能想要原始查询,但我只需要指向正确的方向,我会自己做其余的。

2 个答案:

答案 0 :(得分:1)

由于您在where语句中直接使用表,因此它将被视为普通INNER JOIN。使用where语句来连接表是旧的加入方式,而且更难阅读。如果您想LEFT JOIN table4,我建议您重写这样的查询:

SELECT
    table1.id, 
    table2.userid, 
    table4.groupid
FROM 
    table1
    JOIN table3
        ON table1.table3_id = table3.id  
    JOIN table2
        ON table2.id = table3.table2_id
    LEFT JOIN table4
        ON table2.userid = table4_userid
WHERE
    table3.statement_id = 264803 
order by 
    table4_groupid

答案 1 :(得分:1)

查看WHERE之后的所有情况都是内部联接。

尝试这个,我不确定ON,因为我们不知道表的结构:

SELECT
    t1.id, t2.userid, COALESCE(t4.groupid, 0)
FROM 
    table1 t1 INNER JOIN table3 t3 ON t1.table3_id=t3.id
    INNER JOIN table2 t2 ON t2.id=t3.table2_id
    LEFT JOIN table4 t4 ON t1.userid=t4.table4_userid
WHERE
    t3.statement_id = 264803 
order by t4.groupid