iT邦幫忙

1

mysql 多個欄位及資料表

我有個資料表叫做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欄位不會只有一個的關係(因為會隨著用戶新增而增加
那這樣我該怎麼寫才對?

看更多先前的討論...收起先前的討論...
1對1對多: select 結果當然就是多筆啊.
樓主期望的輸出格式是長成什麼樣子?
asys0512 iT邦新手 3 級 ‧ 2016-08-30 15:24:33 檢舉
我是想假設id是一樣的 則只要出現一筆就可以了
asys0512 iT邦新手 3 級 ‧ 2016-08-30 15:25:46 檢舉
因為輸出的結果我是印出 users_profile 的name欄位
這樣假設A用戶新增5筆資料到users_workexp
搜尋後他會印出兩個以上的A用戶的name
asys0512 iT邦新手 3 級 ‧ 2016-08-30 15:28:07 檢舉
搜尋後他會印出5個A用戶的name*
ID 一樣只出現一筆, 但是 users_workexp 中有5筆資料啊!
請問:這5筆資料只要出現一筆嗎?
asys0512 iT邦新手 3 級 ‧ 2016-08-30 15:52:15 檢舉
對 >< 如果id是一樣的話
asys0512 iT邦新手 3 級 ‧ 2016-08-30 16:02:12 檢舉
因為我印的不是users_workexp 的欄位資料
我要找的只是id
那就只有用 DISTINCT 的方式.
asys0512 iT邦新手 3 級 ‧ 2016-08-30 16:03:40 檢舉
我是使用這樣
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}%'
但這樣會die
wonton iT邦高手 6 級 ‧ 2016-08-31 08:54:35 檢舉
SELECT DISTINCT users_profile.id, users_profile.name 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_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}%'
asys0512 iT邦新手 3 級 ‧ 2016-08-31 10:53:35 檢舉
好怪 若這樣的話其他人我就完全搜尋不到?只搜尋的到在users裡面第一個的那位用戶的資料 其他用戶都印不出來
asys0512 iT邦新手 3 級 ‧ 2016-08-31 12:05:57 檢舉
我發現好像是因為users_workexp的id只有該用戶...所以只能搜尋到他 其他人都無法印出.....

2 個回答

0
fillano
iT邦超人 1 級 ‧ 2016-08-31 13:29:38
最佳解答

看起來你的情況是: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)?

看更多先前的回應...收起先前的回應...
asys0512 iT邦新手 3 級 ‧ 2016-08-31 14:03:12 檢舉

users_workexp 的欄位不用顯示

asys0512 iT邦新手 3 級 ‧ 2016-08-31 14:03:49 檢舉

看起來你的情況是:users與users_profile是1:1的關係,users與users_workexp是1:n的關係? 沒錯~

asys0512 iT邦新手 3 級 ‧ 2016-08-31 14:05:22 檢舉

我只要顯示users_profile的欄位資料

fillano iT邦超人 1 級 ‧ 2016-08-31 14:58:23 檢舉

這樣...那跟users_workexp的join改成left join,然後group by users_profile.id。另外,建議明確指定查詢欄位,不要只放個*。

asys0512 iT邦新手 3 級 ‧ 2016-08-31 15:10:01 檢舉

太神了大大 可以了

1
賽門
iT邦超人 1 級 ‧ 2016-08-30 15:29:36

你應該在User_Profile裏有個使用者帳號的欄位,然後,在User_Workexp裏也增加使用者帳號欄位。

接下來...

User_Profile JOIN User_Workexp ON User_Profile.使用者帳號 = User_Workexp.使用者帳號
asys0512 iT邦新手 3 級 ‧ 2016-08-30 15:37:08 檢舉

有耶 我就是這樣做 只是變成欄位是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}%'

還是不行

賽門 iT邦超人 1 級 ‧ 2016-08-30 16:12:44 檢舉

我的意思是不要用id欄位來JOIN....

asys0512 iT邦新手 3 級 ‧ 2016-08-30 16:16:03 檢舉

甚麼意思壓 哈哈哈 我剛剛邏輯已死......

我要發表回答

立即登入回答