需求場景:
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 |
這樣數據就不會重復,然后前端又能過濾(通過子表來查詢到主表的內容)
