iT邦幫忙

1

MySQL where條件問題

如果我今天有ㄧ個部門欄位長這樣

│ id│      depID│
─────────────────
│  1│  A,A1,B,D1│
─────────────────
│  2│      A,C,D│

然後我在網頁篩選器 選到其中一個部門
例如我選D 只要找到id是2的

select id from table depID = 'D' 
// 目前是這樣寫 這樣就都抓不到

select id from table depID like '%D%' 
//這樣又會把欄位內沒有D 但是有D1或D2的下層部門抓出來 抓到 id是1跟2的

如果要在SQL處理 where要怎甚麼下才能出來

ccutmis iT邦高手 2 級 ‧ 2019-10-24 14:10:53 檢舉
試試 mysql裡面的regexp 舉個例

select * from table where depID regexp "D"
符合結果 D , D1 , D2

select * from table where depID regexp "D[^0-9]"
符合結果 D

效能什麼的我就不知道了,畢竟不熟sql
註:
regexp "D" 只要欄位裡面有"D"就符合
regexp "D[^0-9]" 欄位裡面有"D"而且"D"的後面不能有數字
regexp 相關的語法可以自行google
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
3
小魚
iT邦大師 1 級 ‧ 2019-10-24 13:52:08
select * from depID WHERE 欄位名稱 like '%D%' 

建議你先Google一下SQL語法...
然後建議不要用 * , 最好把所有欄位列出來,
用 * 可能會大大降低程式效率.(執行速度)

看更多先前的回應...收起先前的回應...
柯柯 iT邦新手 3 級 ‧ 2019-10-24 13:52:48 檢舉

可是這樣 會把欄位沒有存 D 但是有存D1等其他的 開頭是D的抓出來

小魚 iT邦大師 1 級 ‧ 2019-10-24 13:55:02 檢舉

如果你有明確要找的當然是用 = 啊,
LIKE 是模糊搜尋.

select * from depID WHERE 欄位名稱 = 'D'

還是建議你先Google一下SQL語法...

柯柯 iT邦新手 3 級 ‧ 2019-10-24 13:58:41 檢舉

我現在是一個部門欄位 可能存了3 4 個部門的代碼
我要篩選的時候只要找其中一個代碼
用like會把 這個部門的下層部門也一起抓到
用 = 又因為欄位內存的不是一個部門 而是多個 會抓不出來

我現在想到是把資料抓出來 再用php去整理 我想問看看有沒有辦法在SQL 處理就好了

小魚 iT邦大師 1 級 ‧ 2019-10-24 14:04:36 檢舉

你把資料表結構列出來吧,
或是方便的話將欄位和資料SHOW出來說明,
會比較知道你的需求.

WadeHuang iT邦新手 5 級 ‧ 2019-10-24 14:04:48 檢舉

小魚 iT邦大師 1 級 ‧ 2019-10-24 14:05:37 檢舉

柯柯,
這樣的資料庫設計方式,
基本上就是創造技術債 XD

ckp6250 iT邦好手 1 級 ‧ 2019-10-24 14:06:07 檢舉

FIND_IN_SET()

柯柯 iT邦新手 3 級 ‧ 2019-10-24 14:07:06 檢舉

我主文有更新 我欄位存的樣子了 他不是部門的table 他是其他的table 去存 他負責的部門代碼

小魚 iT邦大師 1 級 ‧ 2019-10-24 14:10:59 檢舉

一般來說可能會這樣設計

id depGroup depId
1 1 A
2 1 A1
3 1 B
4 1 D1
5 2 A
6 2 C
7 2 D

這樣是不是好處理多了?

ccutmis iT邦高手 2 級 ‧ 2019-10-24 14:32:38 檢舉
id depName parentDepId depNameFull
1 D 0 研發部
2 D1 1 研發部測試組
3 D2 1 研發部開發組
4 A 0 總管理處
5 B 0 業務部
6 C 0 客服部
7 A1 4 總管理處人事部
8 B1 5 業務部業務一課

我個人是比較喜歡類似這樣的結構,可以直接透過depName搜尋取得指定部門,也可以用parentDepId取得上一層的部門為何。
例如 D1的parentDepId 為 1,對應到 id為 1的 D,
可以得知,D1 為 D的子部門,不用存成D,D1,D2這樣...

小魚 iT邦大師 1 級 ‧ 2019-10-24 14:37:47 檢舉

ccutmis
就是遞迴的模式就對了.

ccutmis iT邦高手 2 級 ‧ 2019-10-24 14:58:02 檢舉
0
fuzzylee1688
iT邦研究生 3 級 ‧ 2019-10-24 14:32:14

select * from depTable
WHERE inStr(depID + ',', 'D,') > 0

我要發表回答

立即登入回答