美文网首页
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