我有個資料表叫做users_workexp
每位使用者能夠新增多筆上去
所以這個資料表若用戶有4筆紀錄
則id欄位會出現4個1
users_profile和users資料表的欄位id 每個用戶都會只有一個
SELECT * FROM `users_profile`
JOIN `users` USING (id)
JOIN `users_workexp` USING (id)
WHERE `users_profile`.`username` LIKE '%{$key}%'
OR `users_profile`.`name` LIKE '%{$key}%'
OR `users_profile`.`city` LIKE '%{$key}%'
OR `users_workexp`.`work_name` LIKE '%{$key}%'
OR `users_workexp`.`work_bio` LIKE '%{$key}%'
OR `users`.`email` LIKE '%{$key}%'
");
只是這樣做的話會沒辦法輸出正確的資料....
可能是因為users_workexp的id欄位不會只有一個的關係(因為會隨著用戶新增而增加
那這樣我該怎麼寫才對?
看起來你的情況是:users與users_profile是1:1的關係,users與users_workexp是1:n的關係?
現在的關鍵是,雖然你用users_workexp作為條件來查詢,但是users_workexp的欄位是否要顯示?如果只是用來查詢,而你需要的只是users跟users_profile的資料,那你透過users.id來做group就好了。
如果你也要顯示users_workexp的欄位,那問題就來了,依照你的查詢條件,每個user是可能查到多筆的users_workexp,那你要怎麼顯示?一樣用group by,但是把欄位字串聚合?還是顯示第一筆(不過這也有問題,因為order by只能用在group by之後,所以你得用sub query)?
你應該在User_Profile裏有個使用者帳號的欄位,然後,在User_Workexp裏也增加使用者帳號欄位。
接下來...
User_Profile JOIN User_Workexp ON User_Profile.使用者帳號 = User_Workexp.使用者帳號
有耶 我就是這樣做 只是變成欄位是id
然後用USING跟 ON都一樣 他會出現重複的資料
於是我這樣做
SELECT * FROM `users_profile`
JOIN `users` USING (id)
JOIN (SELECT DISTINCT(id) FROM `users_workexp`)
WHERE `users_profile`.`username` LIKE '%{$key}%'
OR `users_profile`.`name` LIKE '%{$key}%'
OR `users_profile`.`city` LIKE '%{$key}%'
OR `users_profile`.`bio` LIKE '%{$key}%'
OR `users_profile`.`birth` LIKE '%{$key}%'
OR `users_profile`.`skill` LIKE '%{$key}%'
OR `users_workexp`.`work_name` LIKE '%{$key}%'
OR `users_workexp`.`work_jobname` LIKE '%{$key}%'
OR `users_workexp`.`work_bio` LIKE '%{$key}%'
OR `users`.`email` LIKE '%{$key}%'
還是不行
我的意思是不要用id欄位來JOIN....
甚麼意思壓 哈哈哈 我剛剛邏輯已死......