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

2020-05-16  本文已影响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后面,条件不会影响主表返回条数;

上一篇 下一篇

猜你喜欢

热点阅读