精华内容
下载资源
问答
  • mysql left join on使用两个或多个字段关联查询
    千次阅读
    2021-10-28 10:13:40

    mysql left join on使用两个或多个字段关联查询

    解决

    left join on 通过两个或多个字段才可以关联到一条数据

    ON concat( o.to_id, o.from_id )= concat( r.to_id, r.from_id )

    查询如下

    SELECT
    	o.id,r.to_id, r.from_id,r.distance
    FROM
    	my_order AS o
    	LEFT JOIN my_route AS r ON concat( o.to_id, o.from_id )= concat( r.to_id, r.from_id ) 
    WHERE
    	o.id IN (
    		15939,
    		15938,
    		15937,
    	);
    
    
    更多相关内容
  • 数据库在通过连接两张或张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。 在使用left jion时,on和where条件的区别如下: 1、 on条件是在生成临时表时使用的条件,它不管on中的条件...

    数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

    在使用left jion时,on和where条件的区别如下:

    1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

    2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

    eg:

    创建表语句:

    tab1:
    insert into tab1 (id, size) values (1, '10');
    insert into tab1 (id, size) values (2, '20');
    insert into tab1 (id, size) values (3, '30');
    insert into tab1 (id, size) values (4, '11');
    
    tab2:
    insert into tab2 (id, size, name) values (1, '10', 'aaa');
    insert into tab2 (id, size, name) values (2, '20', 'bbb');
    insert into tab2 (id, size, name) values (3, '20', 'ccc');
    

     

    表1

    select * from tab1;

    id

    size

    1

    10

    2

    20

    3

    30

    4

    11

    表2

    select * from tab2;

    size

    name

    10

    aaa

    20

    bbb

    20

    ccc

     

    分析下面两条 sql

    select * from tab1 left join tab2 on (tab1.size = tab2.size)where tab2.name='aaa';

     


    select * from tab1 left join tab2 on (tab1.size = tab2.sizeand tab2.name='aaa');

     

    其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。 而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。

    总结:

    1. 对于left join,不管on后面跟什么条件,左表的数据全部查出来,因此要想过滤需把条件放到where后面

    2. 对于inner join,满足on后面的条件表的数据才能查出,可以起到过滤作用。也可以把条件放到where后面。

     

    on后可跟多个条件,语法如下:

    SELECT
                        *
                    FROM
                        dws.dws_t_result_tmp2 tmp2
                    LEFT JOIN
                       ods.ods_t_tmp1 tmp_a
                    ON
                        (tmp2.branchno='WE-BEIJING-1') and ( tmp2.branchno='RE-BEIJING-1')

    on后边加like:

    select position_name,code,senior_name,parent_code,level from position_name_data pnd right join senior_function_data sfd on regexp_replace(sfd.senior_name,'\\\\','/') like  concat('%',regexp_replace(pnd.position_name,'\\\\','/'),'%')  where senior_name is not null group by position_name,code,senior_name,parent_code,level

     

    参考:

    https://www.2cto.com/database/201709/683213.html

    https://www.2cto.com/database/201805/742735.html

    展开全文
  • mysql join on多条件关联on大于小于

    千次阅读 2020-11-19 15:16:43
    MySQL多个条件关联,join多个条件关联 介绍 使用join关联表时on后面写多个条件 代码 SELECT * FROM lecture l INNER JOIN lecture_limit lt ON l.id = lt.lecture_id INNER JOIN student_class sc ON sc....

    MySQL多个条件关联,join多个条件关联,on后面大于小于><

    介绍

    使用join关联表时on后面写多个条件

    代码

    SELECT
    	* 
    FROM
    	lecture l
    	INNER JOIN lecture_limit lt ON l.id = lt.lecture_id
    	INNER JOIN student_class sc ON sc.CODE = lt.CODE 
    	OR floor( sc.CODE / 1000 ) = lt.CODE 
    	OR floor( sc.CODE / 1000000 ) = lt.CODE 
    	OR floor( sc.CODE / 100000000 ) = lt.CODE 
    	OR floor( sc.CODE / 100000000000 ) = lt.CODE 
    	OR floor( sc.CODE / 1000000000000 ) = lt.CODE
    	where sc.teacher_id =3

    thinkphp组装

    $res = $lecture
                ->field('*')
                ->alias('l')
                ->join('lecture_limit lt', 'l.id = lt.lecture.id')
                ->join('student_class sc', 'sc.code = lt.code or floor(sc.code / 1000) = lt.code or floor(sc.code / 1000000) = lt.code or floor(sc.code / 100000000) = lt.code or floor(sc.code / 100000000000) = lt.code or floor(sc.code / 1000000000000) = lt.code')
                ->where($where)
                ->order(['l.id' => 'desc'])
                ->paginate([
                    'list_rows' => $size,
                    'page' => $page,
                ]);

    效果

    展开全文
  • MySQL多个left join on关联条件的顺序

    千次阅读 多人点赞 2019-12-18 11:49:14
    如果存在多个left join on,请注意on后面的条件与哪个表关联。这一条统计的SQL很重要!例如表A,B,C,A left join B on A.x = B.x left join C on A.x = C.x,B和C的都要和A建立关联,B和C之间是没有任何数据上的...

    注意:下面的案例特别重要!请重视!SQL有点长,但确实是干货!

    结论

    如果存在多个left join on,请注意on后面的条件与哪个表关联。这一条统计的SQL很重要!例如表A,B,C,A left join B on A.x = B.x left join C on A.x = C.x,B和C的都要和A建立关联,B和C之间是没有任何数据上的关系。但是 如果把A.x = C.x改成B.x = C.x,那么B和C的表数据先建立关联并过滤数据,再与A表数据进行关联,这样可能会出现数据丢失!

    案例

    有一张分数表,表字段有日期、姓名、语文得分和数学得分等,请统计每个日期中,语文最高得分的姓名和分数,数学最低得分的姓名和分数。

    思路:过滤出所有日期 left join 筛选语文 on … left join 数学得分 on …
    在这里插入图片描述
    正确的SQL:

    SELECT
    	* 
    FROM
    	( SELECT report_date reportDate FROM tb_more_left_join mlj GROUP BY mlj.report_date ) mix
    	LEFT JOIN (
    SELECT
    	mlj.report_date maxReportDate,
    	GROUP_CONCAT( mlj.user_name ) maxUserNames,
    	a.maxScore 
    FROM
    	tb_more_left_join mlj
    	LEFT JOIN ( SELECT report_date, MAX( chinese_score ) maxScore FROM tb_more_left_join mlj GROUP BY mlj.report_date ORDER BY NULL ) a ON mlj.report_date = a.report_date 
    WHERE
    	mlj.chinese_score = a.maxScore 
    GROUP BY
    	mlj.report_date 
    	) mx ON mix.reportDate = mx.maxReportDate
    	LEFT JOIN (
    SELECT
    	mlj.report_date minReportDate,
    	GROUP_CONCAT( mlj.user_name ) minUserNames,
    	a.minScore 
    FROM
    	tb_more_left_join mlj
    	LEFT JOIN ( SELECT report_date, MIN( math_score ) minScore FROM tb_more_left_join mlj GROUP BY mlj.report_date ORDER BY NULL ) a ON mlj.report_date = a.report_date 
    WHERE
    	mlj.math_score = a.minScore 
    GROUP BY
    	mlj.report_date 
    	) mn ON mix.reportDate = mn.minReportDate
    

    正确结果:
    在这里插入图片描述

    错误的SQL:
    把正确SQL中最后一个on条件改为mx.maxReportDate = mn.minReportDate,注意,是把mix.reportDate改为了mx.maxReportDate。

    错误结果:
    在这里插入图片描述

    错误原因:

    1. 查询语文最高成绩时,没有查到2019-12-01的数据
    2. 查询数学最低成绩时,使用on与语文最高成绩关联,因为没有查到语文最高成绩的日期,所以两个表关联时,数学最低成绩即使有数据,也会因为语文最高成绩无数据而被忽略。

    SQL数据

    CREATE TABLE `tb_more_left_join`  (
      `id` int(11) NOT NULL,
      `report_date` date NULL DEFAULT NULL,
      `user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `math_score` int(255) NULL DEFAULT NULL,
      `chinese_score` int(255) NULL DEFAULT NULL,
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    
    INSERT INTO `tb_more_left_join` VALUES (1, '2019-12-01', '盲僧', 70, NULL);
    INSERT INTO `tb_more_left_join` VALUES (2, '2019-12-01', '薇恩', 100, NULL);
    INSERT INTO `tb_more_left_join` VALUES (3, '2019-12-02', '赵信', 30, 60);
    INSERT INTO `tb_more_left_join` VALUES (4, '2019-12-02', '琴女', NULL, 100);
    INSERT INTO `tb_more_left_join` VALUES (5, '2019-12-03', '蛮王', 50, 100);
    INSERT INTO `tb_more_left_join` VALUES (6, '2019-12-03', '艾希', 100, 100);
    INSERT INTO `tb_more_left_join` VALUES (7, '2019-12-03', '亚索', 60, 90);
    
    展开全文
  • mysql多个if语句

    千次阅读 2021-04-19 04:26:51
    Mysql 语句 有多个条件 查询所有 返回符合条件最多的一条这边先给你提供一个动态SQLselect*fromtablewhere1=1 //这一步是针对所有条件均未满足(where后必须跟子句)if(name != "" and name!=null){ and name=条件一}...
  • 时候我们在使用LEFT JOIN ...... ON .... 时, 除了连接两表的字段条件外,我们往往还需要一些等值或者范围 等等类似的数据筛选条件。 那么对于初学者,往往会犯一错误,就是 想当然 地 认为,ON 后面的...
  • 数据库设计时,没有考虑关联数据的逻辑,通过两个或多个字段才可以关联到一条数据 解决方法 利用MySQL内置的concat函数,对字段进行拼接后,关联查询 比如,我的业务中遇到的是通过name和version进行关联: SELECT ...
  • mysql if条件中的多个条件

    千次阅读 2021-04-19 04:27:49
    我试图将多个参数添加到if语句中.我正在尝试检查两队之间的比赛是否是联赛.SELECT visitor AS school, home AS temp, vl.leagueid AS vleague, hl.leagueid AS hleague,if(vl.leagueid = hl.leagueid, 1, 0) AS ...
  • mysql 多表 多个条件 查询

    千次阅读 2021-01-19 13:21:06
    mysql 查询关键字SELECT 类名 FROM 主表名INNER JOIN 子表名1ON 主表=次表 同样的内容 WHERE 查询条件表请用INNER JOIN连接 且加 同样条件内容SELECT 类名 FROM 主表名INNER JOIN 子表名1INNER JOIN 子表名2ON 主...
  • MySQL-在CASE中组合多个WHEN条件

    千次阅读 2021-07-16 16:49:00
    SELECT CASE org.size WHEN 0 THEN ', COUNT(DISTINCT org.id) AS '# of Companies' FROM org INNER JOIN usr ON usr.orgid = org.id INNER JOIN usr_role ON usr.id = usr_role.usrid WHERE org.deleted = 0 AND ...
  • centos安装多个mysql

    千次阅读 2018-10-26 20:28:22
    linux 下安装多个mysql
  • 这是两张表的关联后的数据,现在是labelName = 9 and labelname = 108 时显示第一条, 当labelName = 9 and labelname = 23时显示第二条数据,类似很种组合查找 子堇 | 园豆:161 (初学一级) | 2018-12-28 13:59 ...
  • mysql 实现主键之外的多个字段自增

    千次阅读 2020-09-24 16:44:15
    通过sql实现编号自动增加,序号也是自动增加,一编号下有20序号,id是主键 尝试使用触发器 create trigger my_trigger before insert on test.test for each row begin set new.`编号`=(select if(`序号`=...
  • MySql存在多个root用户

    千次阅读 2020-07-01 17:46:33
    因为mysql的登陆用户是可以限制某个用户在某个IP才能登陆的,所以你看到一用户有条数据也是不奇怪,你可以将Host+user来作为一标准 一、 用户登录 格式: mysql -h主机地址 -u用户名 -p用户密码 mysql ...
  • MySQL 一个字段,用','隔开,存储多个id,关联查询

    千次阅读 多人点赞 2019-07-03 16:31:10
    MySQL 一个字段,用’,'隔开,存储多个id,关联查询 因为朋友过来问我,一个商品表的一个颜色的关联字段,里面放着多个颜色的id,这些id用逗号隔开,然后想要查出一条商品记录上显示出所有颜色。实现效果如下: 商品...
  • mysql根据条件批量插入更新(on duplicate key update)

    千次阅读 热门讨论 2019-09-26 21:47:04
    一、前言  ...一般来说我们都是采用on duplicate key update 写法,只是假如我们需要、在唯一字段相同,并且满足其他条件时才进行更新,那么该怎么写这"where"条件呢?on duplicate key upd...
  • join on多个条件的理解

    万次阅读 多人点赞 2020-06-12 16:03:28
    左连接,on后面跟了2条件,其中第二条件对左表进行刷选,可以看到在结果中并没有起作用。因为on的条件筛选是对2张表生成的全连接(笛卡尔积)临时表进行的筛选,这时a.id=4的数据实际上是被去除掉了,因为没有a....
  • mysql触发器之创建多个触发器

    千次阅读 2018-07-13 13:30:41
    这次记录的内容mysql 版本必须得是5.7.2+的哈,之前的会不好使的。... mysql 5.7.2+版本解决了这样限制,并允许我们为表中的相同事件和动作时间创建多个触发器。当事件发生时,触发器将依次激活。我们来参考创...
  • 在一台机器上一个MySQL服务器运行多个MySQL实例有什么好处?这里我先入为主给大家介绍这样做至少存在两个好处(看完这篇文章后理解会更透彻): (1)减轻服务器链接负担 (2)为不同的用户提供不同的mysqld服务器...
  • mysql多个嵌套查询

    千次阅读 2019-03-06 16:33:13
    MySQL多个Left join 子查询 好久没写sql了,今天突然接到产品的需求,要拉取线上数据一个文章的统计,我心里就万马奔腾…TM,不是有前端埋点和事件埋点。。。 简单的联表查询 SELECT a.id, a.thumbNail, a. ...
  • mysql左连接条件,on子句条件

    万次阅读 2019-06-03 18:06:45
    想查询一列表,字段包括:用户名、商品ID、商品名称、商品描述,条件:所有用户拥有禁用的商品,如果用户没有禁用的商品也查询出用户的信息。 查询一:条件放在总查询 where 后面 select u.name,g.goods_...
  • MysqlON DUPLICATE KEY问题

    千次阅读 2018-12-11 15:29:20
    当同一设备(device_id)的同一app(package_name)在同一天(collect_date)的采集数据,如果存在,则更新,不存在,则插入。 使用如下语句完成以上需求: INSERT INTO app_use_report (device_id, app_name,...
  • MySQLmysql left join 多个

    千次阅读 2017-07-24 11:46:48
    参考:mysql left join 多个表 SQL:select * from t_a a left join t_b b on a.bid = b.bid left join t_c c on a.cid = c.cid t_a表t_b表 t_c表总的结果: ==================================================...
  • 数据库左右连接on后的限制条件问题

    千次阅读 2021-01-19 21:53:03
    测试环境:MySQL 5.7.19HeidiSQL 9.3 数据库界面连接工具(挺好用的)碰到的问题是:Select * from t1 left outer join t2 on t1.id=t2.id and t2.age>18 和Select * from t1 left outer join t2 on t1.id=t2.id ...
  • Mysql多个查询结果并列显示

    千次阅读 2020-05-23 11:51:27
    目录一、需求二、表数据三、查询语句四、查询结果 ... #student_name取b表的(如果取的a表的student_name,该同学又恰好没一及格,student_name就为NULL了) b.`student_name`, b.total_number, a.numb
  • linux安装多个mysql

    千次阅读 2019-09-21 08:06:46
    一、 Mysql多实例即一台服务器上运行多个Mysql服务进程 ,开启不同的服务端口,通过不同的socket 监听不同的服务端口来提供各自的服务。 二、 Mysql多例有以下几个特点:  1、有效利用服务器资源:通过多实例地...
  • 若B表有多个符合记录行,则生成多个临时表行,若B表没有符合条件的行,则生成一条所有字段均为null的行与A的记录行连接,若没有ON条件,则以“笛卡尔积”的形式连接,即A结果集的每一行和B表的每一行均连接生成临时...
  • mysql在表中添加多个外键

    千次阅读 2020-04-19 16:24:34
    级联: 在末尾可加上(可单独添加,也可全部添加): ON UPDATE CASCADE(级联更新) ON DELETE CASCADE(级联删除) 1 2 比如: ALTER TABLE `ym` ADD CONSTRAINT `fk_author` FOREIGN KEY (`au_id`)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 431,102
精华内容 172,440
关键字:

mysql多个on

mysql 订阅