需求场景:

  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)的更多相关文章

  1. SQL左连接查询 left join ... on

    左连接查询 保留左边主表的所有行(即使在右表没有匹配的行),右表输出满足 on 条件的行,不满足的输出null   示例:组合两个表 - 力扣 表1: Person +--------------+- ...

  2. mysql之左连接、右连接、内连接、全连接、等值连接、交叉连接等

    mysql中的各种jion的记录,以备用时查 1.等值连接和内连接, a.内连接与等值连接效果是相同的,执行效率也相同,只是书写方式不一样,内连接是由SQL 1999规则定的书写方式 比如: sele ...

  3. 最常用SQL joins:内连接(交集)、左外连接、右外连接、左连接、右连接、全连接(并集),全外连接

    1.内连接.两个表的公共部分用Inner join,Inner join是交集的部分. Select * from TableA A inner join TableB B on A.key=B.ke ...

  4. mysql 内连接、左连接、右连接

    记录备忘下,初始数据如下: DROP TABLE IF EXISTS t_demo_product; CREATE TABLE IF NOT EXISTS t_demo_product( proid ...

  5. 《Entity Framework 6 Recipes》中文翻译系列 (16) -----第三章 查询之左连接和在TPH中通过派生类排序

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-10应用左连接 问题 你想使用左外连接来合并两个实体的属性. 解决方案 假设你有 ...

  6. 数据库中的左连接(left join)和右连接(right join)区别

    Left Join / Right Join /inner join相关 关于左连接和右连接总结性的一句话: 左连接where只影向右表,右连接where只影响左表. Left Join select ...

  7. MySQL的左连接、右连接和全连接的实现

    表student:+----+-----------+------+| id | name | age |+----+-----------+------+| 1 | Jim | 18 || 2 | ...

  8. Oracle 左连接、右连接、全外连接、(+)号作用

    分类: Oracle Oracle  外连接 (1)左外连接 (左边的表不加限制)       (2)右外连接(右边的表不加限制)       (3)全外连接(左右两表都不加限制) 外连接(Outer ...

  9. Linq连接查询之左连接、右连接、内连接、全连接、交叉连接、Union合并、Concat连接、Intersect相交、Except与非查询

    内连接查询 内连接与SqL中inner join一样,即找出两个序列的交集 Model1Container model = new Model1Container(); //内连接 var query ...

随机推荐

  1. express 设置node_env的环境变量

    设置process.env.NODE_ENV的环境变量可以用以下2种方式: //在你的app.js文件中设置 process.env.NODE_ENV = 'development'; //在pack ...

  2. . net 源代码调试

    对于 .net framework 中的代码,光拿 Reflector 看是不够过瘾的,如果能够调试进去就好了! 其实,微软是提供了一套 sourcecode 的下载的: http://referen ...

  3. appium安卓自动化的 常用driver方法封装

    appium安卓自动化的 常用driver方法封装 做安卓自动化的时候,很多方法写起来会造成代码冗余,把这部分封装起来 ,添加到androidUI工具类里,随时可调用 都放在这个类下面: @Compo ...

  4. C# 延时函数 非Sleep

    1.示例: using System.Runtime.InteropServices; [DllImport("kernel32.dll")] static extern uint ...

  5. C#中WebBrowser控件的使用

    今天在YouTube上看了一个关于WebBrowser控件用法的小视频,做一下总结. 首先创建一个WinForm程序,拖入一个textbox控件和一个button按钮,然后拖入一个panel控件,如图 ...

  6. c++多继承浅析

            图一                                                                                       图二 ...

  7. java有序的hashmap

    使用LinkedHashmap可以构建一个有序的map 引用:http://wiki.jikexueyuan.com/project/java-collection/linkedhashmap.htm ...

  8. JAVA-JSP表达式

    相关资料: <21天学通Java Web开发> 结果总结: 1.<%= %>JSP表达式中的代码会首先执行,然后转换成字符串显示到网页上.2.JSP表达式标签不必也不能使用分号 ...

  9. Gtest创建第一个测试

    gtest测试框架是在不同平台上(Linux,Mac OS X,Windows,Cygwin,Windows CE和Symbian)为编写C++测试而生成的.它是基于xUnit架构的测试框架,支持自动 ...

  10. 访问控制列表-基于IP

    [总结] 在交换机1上划分vlan然后把fa0/1接口设置为trunk周围几个接口都设置为access.在RA上划分四个逻辑口(就是小数点的那些接口).然后RA和RB都做ospf就可以ping同. 最 ...