mysql中左连接后,最终的记录数大于左边表的记录分析

如果B表符合条件的记录数大于1条,就会出现1:n的情况,这样left join后的结果,记录数会多于A表的记录数。

例如:member与member_login_log表的结构如下,member记录会员信息,member_login_log记录会员每日的登入记录。member表的id与member_login_log表的uid是对应关系。

member 表

member_login_log 表

查询member用户的资料及最后登入日期:
如果直接使用left join

select a.id, a.username, b.logindate

from member as

left join member_login_log as b on a.id = b.uid;

因member_login_log符合条件的记录比member表多(a.id = b.uid),所以最后得出的记录为:

但这并不是我们要的结果,因此这种情况需要保证B表的符合条件的记录是空或唯一,我们可以使用group by来实现。

select a.id, a.username, b.logindate

from member as

left join (select uid, max(logindate) as logindate from member_login_log group by uid) as b

on a.id = b.uid;

总结:使用left join的两个表,最好是1:1 或 1:0的关系,这样可以保证A表的记录全部显示,B表显示符合条件的记录。

时间: 2024-10-19 16:13:59

mysql中左连接后,最终的记录数大于左边表的记录分析的相关文章

无法远程连接mysql,连接后也没有权限创建数据库

问题现象:无法远程连接mysql,连接后也没有权限创建数据库 问题原因: MySql-Server 出于安全方面考虑只允许本机(localhost, 127.0.0.1)来连接访问. 这对于 Web-Server 与 MySql-Server 都在同一台服务器上的网站架构来说是没有问题的. 但随着网站流量的增加, 后期服务器架构可能会将 Web-Server 与 MySql-Server 分别放在独立的服务器上, 以便得到更大性能的提升, 此时 MySql-Server 就要修改成允许 Web-

MySQL删除ibdata1后,如何通过.frm文件把表结构恢复过来

一.创建一个表test_0  CREATE TABLE `te`.`test_0`(         `id` INT(9) ZEROFILL NOT NULL,       `name` VARCHAR(12),       PRIMARY KEY (`id`)     ) ENGINE=INNODB; 二.把以下3个文件删除掉   文件目录:D:\Program Files\MySQL\MySQL Server 5.5\data 三.重启数据库,再访问test_0时出现以下问题 此时,该表无

MySQL常见连接查询

在实际应用中,由于不同的业务需求,一般的select查询语句无法满足要求.所以就需要了解一些MySQL的高级查询方式 内连接 inner join 典型的连接查询,有相等(=)连接和不等(<>)连接.如:现在有产品表及供应商表 产品表: 供应商表: 如果现在有个需求:查询产品表中产品对应的供应商公司名称及地址.那么就可以根据产品表中的供应商ID进行连接查询 这样根据两个表中供应商ID相同的条件,就查询出想要的数据.注:连接查询默认为inner join,所以inner可省略不写 左连接 lef

mysql学习笔记——对数据表中记录的操作

对记录的操作,主要有增.删.改.查 一.记录插入命令:insert into 表名(列名,列名, .... ) values(值, 值, ....); 值个数应该列个数相同,值顺序和列顺序相同,值类型和列字段类型匹配 当表名后面省略列名时,values后面要给出所有列的值 插入数据时,字符串添加 单引号 '' ---- 字符型和日期型数据应包含在单引号中 插入数据时,中文乱码问题:将客户端的编码集设置为gbk 修改mysql 配置文件,永久改变客户端编码集 ----- mysql/my.ini

[转载]mysql创建临时表,将查询结果插入已有表中

今天遇到一个很棘手的问题,想临时存起来一部分数据,然后再读取.我记得学数据库理论课老师说可以创建临时表,不知道mysql有没有这样的功能呢?临时表在内存之中,读取速度应该比视图快一些.然后还需要将查询的结果存储到临时表中.下面是创建临时表以及插入数据的例子,以供大家参考. A.临时表再断开于mysql的连接后系统会自动删除临时表中的数据,但是这只限于用下面语句建立的表:1)定义字段  CREATE TEMPORARY TABLE tmp_table (      name VARCHAR(10)

mysql创建临时表,将查询结果插入已有的表

A.临时表再断开于mysql的连接后系统会自动删除临时表中的数据,但是这只限于用下面语句建立的表:1)定义字段  CREATE TEMPORARY TABLE tmp_table (      name VARCHAR(10) NOT NULL,       time date  NOT NULL  )更高级点就是:create temporary  TABLE `temtable` (  `jws` varchar(100) character set utf8 collate utf8_bi

MYSQL删除表的记录后如何使ID从1开始

MYSQL删除表的记录后如何使ID从1开始 MYSQL删除表的记录后如何使ID从1开始 http://hi.baidu.com/289766516/blog/item/a3f85500556e2c09728da5e1.html 2009-11-30 14:24 方法1:truncate table 你的表名//这样不但将数据全部删除,而且重新定位自增的字段 方法2:delete from 你的表名dbcc checkident(你的表名,reseed,0) //重新定位自增的字段,让它从1开始

MySQL获取分组后的TOP 1和TOP N记录

有时会碰到一些需求,查询分组后的最大值,最小值所在的整行记录或者分组后的top n行的记录,在一些别的数据库可能有窗口函数可以方面的查出来,但是MySQL没有这些函数,没有直接的方法可以查出来,可通过以下的方法来查询. 准备工作 测试表结构如下: root:test> show create table test1\G *************************** 1. row *************************** Table: test1 Create Table:

mysql 怎么查询出,分组后的总条数。。。也就是有多少组数。。。。怎么写

SELECT COUNT(*) AS 多少组数FROM( SELECT id FROM 表 GROUP BY id) subQuery;Mysql,有一个表含有以下字段,uid 发帖人id,title 发帖标题,tc 发帖内容,time 发帖时间,用一条语句算出昨天发帖书大于10的,一共有多少人? select count(*) from (select distinct startperson_id,count(startperson_id) as num from apphome_finan