需求場景:前端
一、前端使用的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 |
這樣數據就不會重複,而後前端又能過濾(經過子表來查詢到主表的內容)