假设有一个用户表(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后面,条件不会影响主表返回条数;
网友评论