左连接去重(objec)
需求场景:
1、前端使用的object-table(angularJs)
2、自定义模糊查询
可以模糊查询主表,主表没有数据的时候,可通过字表的(name或者hostname)字段来查询(主-子:一对多的关系)。两个表通过p_id和t_name关联
eg:主表A
| id | name | pid | t_name |
| 1 | aa | 1 | test1 |
| 2 | bb | 2 | test1 |
| 3 | ccc | 1 | test2 |
| 4 | ddd | 3 | test3 |
字表B
| id | pid | t_name | b_name | isTrue |
| 1 | 1 | test1 | ee | y |
| 2 | 1 | test2 | aa | y |
| 3 | 2 | test1 | ff | y |
| 4 | 3 | test4 | ww | n |
原本是查询A表,然后展示(可模糊查询),只展示A表的数据。但是后需求变为模糊查询的时候,如果A表查不到数据,即根据B表的b_name找出A表的数据
这里有个使用技巧,当后台使用拼接sql的时候,where 1=2 或者 where 1=1可以少写很多代码,因为你不确定where 后面是否有条件
select a.*,b.b_name from A a left join B b on(a.pid=b.pid and a.t_name=b.t_name) where 1=2 or a.name like '%aa%' or b.b_name like '%aa%';
这样得到的结果是
| id | name | pid | t_name | b_name |
| 1 | aa | 1 | test1 | ee |
| 1 | aa | 1 | test1 | aa |
因为我只展示A表,所以其实我是不用select b.b_name的。在页面的时候就隐藏了b_name这列。
| id | name | pid | t_name | |
| 1 | aa | 1 | test1 | |
| 1 | aa | 1 | test1 |
这样导致了数据重复了,导致数据不对。
select a.*,b.b_name from A a left join B b on(a.pid=b.pid and a.t_name=b.t_name) where 1=2 or a.name like '%aa%' or b.b_name like '%aa%';
如果我去重复只显示一条,数据也是不对的,因为明明是两条数据,数据库查出来去重也是两条,只是那个字段没显示而已。
重复数据不是客户要的结果。
那么就不要显示b.b_name然后去重
select distinct a.* from A a left join B b on(a.pid=b.pid and a.t_name=b.t_name) where 1=2 or a.name like '%aa%' or b.b_name like '%aa%';
这样就会得到一条数据,这就是我们想要的结果了
But!!!!
虽然我们得到了想要的结果。但是因为没有select b表的b_name导致前端表格是没有这个字段展示的。
如果A中没有查询到内容,就会用B表的b_name字段去查询。使用object-table模糊查询的时候,它不会有数据显示
假如使用B表中的“ff”去查询数据,实际上是有一条数据的,但是前端就是不显示(后台已返回该数据)
select distinct a.* from A a left join B b on(a.pid=b.pid and a.t_name=b.t_name) where 1=2 or a.name like '%ff%' or b.b_name like '%ff%';
应该得到的数据
| id | name | pid | t_name | b_name |
| 2 | bb | 2 | test1 | ff |
实际展示的数据
| id | name | pid | t_name | |
| 2 | bb | 2 | test1 |
得到这样的数据之后,再去模糊查询“ff”,后台会返回这条数据,但是前端就不不显示,想了好久才知道,原来是object-table自带的过滤导致的,虽然数据已经到前端了(本应该正常显示),但是因为前端列表中没有‘ff’字符串,然后搜索框中又有‘ff’字符串。
解决方法:1、因为用的是后端的模糊查询,可以关掉object-table自带的过滤(因为对object-table不熟,所以也不知道怎么关闭,这是自己想的理想状态。。。)
2、吧b_name这里在前端显示出来,但是也不要让前面的数据重复。这就是重点了,动态拼接前端模糊查询的字段(‘aa’就是模糊查询的字符串),这里需要好生理解,或者建两个简单的表测试一下
select distinct a.* ,‘aa’ as b_name from A a left join B b on(a.pid=b.pid and a.t_name=b.t_name) where 1=2 or a.name like '%aa%' or b.b_name like '%aa%';
| id | name | pid | t_name | b_name |
| 1 | aa | 1 | test1 | ee |
| 1 | aa | 1 | test1 | aa |
结果由最上面的变成
| id | name | pid | t_name | b_name |
| 1 | aa | 1 | test1 | aa |
这样数据就不会重复,然后前端又能过滤(通过子表来查询到主表的内容)
左连接去重(objec)的更多相关文章
- SQL左连接查询 left join ... on
左连接查询 保留左边主表的所有行(即使在右表没有匹配的行),右表输出满足 on 条件的行,不满足的输出null 示例:组合两个表 - 力扣 表1: Person +--------------+- ...
- mysql之左连接、右连接、内连接、全连接、等值连接、交叉连接等
mysql中的各种jion的记录,以备用时查 1.等值连接和内连接, a.内连接与等值连接效果是相同的,执行效率也相同,只是书写方式不一样,内连接是由SQL 1999规则定的书写方式 比如: sele ...
- 最常用SQL joins:内连接(交集)、左外连接、右外连接、左连接、右连接、全连接(并集),全外连接
1.内连接.两个表的公共部分用Inner join,Inner join是交集的部分. Select * from TableA A inner join TableB B on A.key=B.ke ...
- mysql 内连接、左连接、右连接
记录备忘下,初始数据如下: DROP TABLE IF EXISTS t_demo_product; CREATE TABLE IF NOT EXISTS t_demo_product( proid ...
- 《Entity Framework 6 Recipes》中文翻译系列 (16) -----第三章 查询之左连接和在TPH中通过派生类排序
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-10应用左连接 问题 你想使用左外连接来合并两个实体的属性. 解决方案 假设你有 ...
- 数据库中的左连接(left join)和右连接(right join)区别
Left Join / Right Join /inner join相关 关于左连接和右连接总结性的一句话: 左连接where只影向右表,右连接where只影响左表. Left Join select ...
- MySQL的左连接、右连接和全连接的实现
表student:+----+-----------+------+| id | name | age |+----+-----------+------+| 1 | Jim | 18 || 2 | ...
- Oracle 左连接、右连接、全外连接、(+)号作用
分类: Oracle Oracle 外连接 (1)左外连接 (左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接(左右两表都不加限制) 外连接(Outer ...
- Linq连接查询之左连接、右连接、内连接、全连接、交叉连接、Union合并、Concat连接、Intersect相交、Except与非查询
内连接查询 内连接与SqL中inner join一样,即找出两个序列的交集 Model1Container model = new Model1Container(); //内连接 var query ...
随机推荐
- mysql 下载
mysql 下载
- 使用 JavaScript 实现对 PDF 的全文索引
Mozilla实验室最近已经收到了许多为一个项目做出的尝试,这一项目的野心令人印象深刻:在一个浏览器中仅仅使用Javascript来对PDF进行渲染.PDF文档的结构令人难以置信的复杂,因此要祝pdf ...
- posix多线程--条件变量
条件变量是用来通知共享数据状态信息的. 1.条件变量初始化两种方式:(1)静态初始化pthread_cond_t cond = PTHREAD_COND_INITIALIZER;代码示例如下: #in ...
- 每日英语:New Reason To Get The Kids To Bed On Time
Going to bed at the same time every night could give your child's brain a boost, a recent study foun ...
- kafka之partition分区及副本replica升级
修改kafka的partition分区 bin/kafka-topics.sh --zookeeper datacollect-2:2181 --alter --partitions 3 --topi ...
- Tomcat: Could not clean server of obsolete files
<Context path="/mldn" docBase="E:/web.workspace/mldndemo/WebContent" reloadab ...
- [转]Windows Server 2008 对 CPU 及 RAM 的支持规格
Windows Server 2008 对 CPU 的支援: 在看到下表时,请注意其数字所指的是:主板上的实体 CPU的个数,也就是几个 Sockets 举例来说,机器上安装 2 个 4 核心的 CP ...
- openldap 备份与导入 及相关问题
摘要: 对openldap进行备份时,直接使用slapcat命令进行备份,使用ldapadd还原出现问题及解决. 介绍: 对openldap进行备份时,直接使用slapcat命令进行备份(如代码一), ...
- 分享JQuery动画插件Velocity.js的六种列表加载特效
分享JQuery动画插件Velocity.js的六种列表加载特效.在这款实例中给中六种不同的列表加载效果.分别为从上飞入.从右侧飞入.从左侧飞入.和渐显.一起看下效果图: 在线预览 源码下载 实现 ...
- Android——数据存储:手机内部存储
存取字符串和存取图片不相同 xml <EditText android:layout_width="match_parent" android:layout_height=& ...