左鏈接去重(objec)

需求場景:前端

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

  二、自定義模糊查詢數據庫

    能夠模糊查詢主表,主表沒有數據的時候,可經過字表的(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

   字表Bspa

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 後面是否有條件table

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

  這樣獲得的結果是angular

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’字符串。

解決方法:一、由於用的是後端的模糊查詢,能夠關掉object-table自帶的過濾(由於對object-table不熟,因此也不知道怎麼關閉,這是本身想的理想狀態。。。)

     二、吧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
         

 

這樣數據就不會重複,而後前端又能過濾(經過子表來查詢到主表的內容)

相關文章
相關標籤/搜索