美文网首页
MYSQL联表查询LEFT JOIN 中 条件放在ON后面和放在

MYSQL联表查询LEFT JOIN 中 条件放在ON后面和放在

作者: 向南路人 | 来源:发表于2020-05-16 12:00 被阅读0次

    假设有一个用户表(d_user):

    CREATE TABLE IF NOT EXISTS `d_user` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',
      `name` varchar(50) NOT NULL COMMENT '用户名',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='用户表';
    

    用户数据如下:

    mysql> select * from d_user;
    +----+--------+
    | id | name   |
    +----+--------+
    |  1 | 张三   |
    |  2 | 李四   |
    +----+--------+
    2 rows in set (0.00 sec)
    

    一个订单表(d_order):

    CREATE TABLE IF NOT EXISTS `d_order` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',
      `user_id` bigint(20) NOT NULL COMMENT '用户id',
      `status` tinyint(1) default 0 NOT NULL COMMENT '订单状态 1:已支付 0:待支付',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表';
    

    订单数据如下:

    mysql> select * from d_order;
    +----+---------+--------+
    | id | user_id | status |
    +----+---------+--------+
    |  1 |       1 |      1 |
    +----+---------+--------+
    1 row in set (0.00 sec)
    

    假如需要查询用户已支付订单数量:
    第一种写法:

    mysql> SELECT
        -> d_user.NAME,
        -> count( d_order.id ) AS total
        -> FROM
        -> d_user
        -> LEFT JOIN d_order ON d_order.user_id = d_user.id
        -> WHERE
        -> d_order.STATUS = 1
        -> GROUP BY
        -> d_user.id;
    +--------+-------+
    | NAME   | total |
    +--------+-------+
    | 张三   |     1 |
    +--------+-------+
    1 row in set (0.00 sec)
    

    第二种写法:

    mysql> SELECT
        -> d_user.NAME,
        -> count( d_order.id ) AS total
        -> FROM
        -> d_user
        -> LEFT JOIN d_order ON d_order.user_id = d_user.id
        -> AND d_order.STATUS = 1
        -> GROUP BY
        -> d_user.id;
    +--------+-------+
    | NAME   | total |
    +--------+-------+
    | 张三   |     1 |
    | 李四   |     0 |
    +--------+-------+
    2 rows in set (0.00 sec)
    

    总结:
    联表时条件放在WHERE后面,条件会影响主表返回条数;
    联表时条件放在ON后面,条件不会影响主表返回条数;

    相关文章

      网友评论

          本文标题:MYSQL联表查询LEFT JOIN 中 条件放在ON后面和放在

          本文链接:https://www.haomeiwen.com/subject/zythohtx.html