【问题标题】:simplifying mysql query with joins使用连接简化 mysql 查询
【发布时间】:2014-09-30 12:21:50
【问题描述】:

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

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

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

我的问题是:

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

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

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

【问题讨论】:

    标签: mysql join


    【解决方案1】:

    由于你在where语句中直接使用表,所以会被认为是普通的INNER JOINs。使用 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
    

    【讨论】:

    • 您在查询中table1table3.table2_id 之后有一个拼写错误,
    • @CodeBird : 谢谢;)。更新了
    • np,table1 FROM table1, 后面的那个我删了
    • 好的 - 我现在明白了。谢谢
    • 没问题。很高兴为您提供帮助;)
    【解决方案2】:

    WHERE之后的条件,以上都是内连接。

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      相关资源
      最近更新 更多