左连接去重(objec)

本文探讨了在使用AngularJS的object-table进行模糊查询时遇到的问题及解决方案,特别是在主子表查询中,如何避免数据重复并确保前端正确显示查询结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求场景:

  1、前端使用的object-table(angularJs)

  2、自定义模糊查询

    可以模糊查询主表,主表没有数据的时候,可通过字表的(name或者hostname)字段来查询(主-子:一对多的关系)。两个表通过p_id和t_name关联

  eg:主表A

idnamepidt_name
1aa1test1
2bb2test1
3ccc1test2
4ddd3test3

   字表B

idpidt_nameb_nameisTrue
11test1eey
21test2aay
32test1ffy
43test4wwn

  原本是查询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%';

  这样得到的结果是

idnamepidt_nameb_name
1aa1test1ee
1aa1test1aa

  因为我只展示A表,所以其实我是不用select b.b_name的。在页面的时候就隐藏了b_name这列。

idnamepidt_name 
1aa1test1 
1aa1test1

  这样导致了数据重复了,导致数据不对。

  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%';

                          应该得到的数据

idnamepidt_nameb_name
2bb2test1ff

 

                        实际展示的数据

idnamepidt_name 
2bb2test1 

得到这样的数据之后,再去模糊查询“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%';

idnamepidt_nameb_name
1aa1test1ee
1aa1test1aa

                                        结果由最上面的变成

idnamepidt_nameb_name
1aa1test1aa
     

 

这样数据就不会重复,然后前端又能过滤(通过子表来查询到主表的内容)

转载于:https://www.cnblogs.com/zml-java/p/9445162.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值