左連接去重(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
         

 

這樣數據就不會重復,然后前端又能過濾(通過子表來查詢到主表的內容)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM