2013-09-21 63 views
0

我有一個鬥爭在這裏試圖抓住從3數據庫表中的一些數據獲取數據..從3個MySQL表

的想法是,用戶可以填寫自己的個人資料與幾個領域,我存儲每個配置文件字段,字段值和用戶在單獨的表中選擇值。

表的結構是這樣的:

Table 'profile_fields' 
- id 
- name 
- sort 
- status (enum '0', '1') 

Table 'profile_field_values' 
- id 
- profile_field_id 
- name 

Table 'user_profile_fields' 
- user_id 
- profile_field_id 
- profile_field_value_id 

將是非常好的,如果你能告訴我如何構造這個查詢,以及爲什麼你用你一起做。

另外,當用戶基數增長時,這個表格佈局如何擴展?

非常感謝你提前!

編輯: 好的,我仍然無法弄清楚如何使它從'profile_fields'返回所有字段以及'user_profile_fields'中用戶選擇的選項。如果用戶沒有選擇一個值,它應該是空的。

這是我的(無功能)查詢至今:

SELECT PF.id AS field_id, PF.name AS field_name, UPF.profile_field_value_id AS value_id, PF.type, PFV.name 
FROM profile_fields PF 
LEFT JOIN profile_fields_values PFV ON PFV.profile_field_id = PF.id 
LEFT JOIN user_profile_fields UPF ON UPF.user_id=1 AND PF.id = UPF.profile_field_id 
WHERE length(PF.name) > 0 and PF.status = '1' 
ORDER BY PF.sort 

該查詢似乎工作,但它不會從「profile_field_values」獲取值的名稱:

SELECT PF.id AS field_id, PF.name AS field_name, UPF.profile_field_value_id AS value_id, PF.type 
FROM profile_fields PF 
LEFT JOIN user_profile_fields UPF ON UPF.user_id =1 
AND PF.id = UPF.profile_field_id 
WHERE LENGTH(PF.name) >0 
AND PF.status = '1' 
ORDER BY PF.sort 
+1

'我在這裏掙扎試圖從3個數據庫表中獲取一些數據.'而你在掙扎時嘗試了什麼,用你的一些代碼更新你的問題。 – Prix

+0

注意,使用ENUM中的數字時要小心。確保您的enum查詢正確引用。 – James

+0

@詹姆斯,是的,我發現了這一點。起初,我收到一個錯誤,因爲沒有引用該值。謝謝:-) – user1169875

回答

-1

好像簡單連接應該工作:

SELECT pf.id, pf.name, pf.sort, pf.status, 
    pfv.id, pfv.profile_field_id, pfv.name, 
    upf.user_id, upf.profile_field_id, upf.profile_field_value_id 
FROM profile_fields pf 
    INNER JOIN profile_field_values pfv 
     ON pf.id = pfv.profile_field_id 
    INNER JOIN user_profile_fields upf 
     ON upf.profile_field_value_id = pfv.id AND upf.profile_field_id = pf.id 

A Visual Explanation of SQL Joins

這使用INNER JOIN從每個表格中選擇所有匹配的記錄 - 查看帖子以區分INNEROUTER聯接之間的差異。

+0

非常感謝!我知道解釋連接的方法,但上次我諮詢了它,我似乎沒有得到它,但我想我可以再試一次:-)但是,我試圖讓它與LEFT JOIN一起工作。那不行?再次,謝謝一堆! – user1169875

+0

@ user1169875 - 你絕對可以使用'OUTER JOIN'('LEFT JOIN') - 只需更換'INNER JOIN'。即使沒有來自其他兩個表的匹配,這將返回'profile_fields'表中的所有記錄。祝你好運! – user2480596

+0

用INNER JOIN好得多:-P謝謝你,真的! – user1169875

0

我認爲你在那裏有一些不必要的複雜性。也許你應該嘗試

表 'profile_fields'

  • ID
  • 排序
  • 狀態(枚舉 '0', '1')

表「profile_field_values '

  • ID
  • USER_ID
  • profile_field_id

爲什麼有3個表?

+0

你好。我這樣做是爲了能夠輕鬆添加新的可選值。這些值將被放入一些選擇框供用戶選擇:-) – user1169875