2014-11-08 92 views
2

我有一個tbl_categories表如下:與多個外鍵加入

id category_name parent_id status category_order slug 

我有另一個表tbl_users其中每個用戶記錄可以屬於一個最大的3個主要類別和3個子類在每個主要(所以,總共3個主要和9個子)

我知道我可以在tbl_users表上使用別名,並創建我的查詢,它將返回用戶所屬的類別和子類別。但是,我可以爲tbl_users想到的表結構表看起來是這樣的:

ID用戶名密碼maincat_1 subcat_1_1 subcat_1_2 subcat_1_3 maincat_2 subcat_2_1 subcat_2_2 subcat_2_3 maincat_3 maincat_3_1 maincat_3_2 maincat_3_3

是有更好的結構/方法來做到這一點?

+0

這是一個很好的結構。 你可以創建一個表連接cats到用戶,但是你會有一個更復雜的連接查詢,另外必須在代碼的某個地方執行3/9規則。 – mainstreetmark 2014-11-08 08:52:16

回答

0

要查詢屬於用戶子類別:

SELECT t1.first_name, t1.last_name, m1.category_name AS maincategory_1, m2.category_name AS maincategory_2, m3.category_name AS maincategory_3 
    FROM tbl_user_individual AS t1 
    LEFT JOIN tbl_categories AS m1 ON t1.subcat_1 = m1.id 
    LEFT JOIN tbl_categories AS m2 ON t1.subcat_2 = m2.id 
    LEFT JOIN tbl_categories AS m3 ON t1.subcat_3 = m3.id 
    LEFT JOIN tbl_categories AS m4 ON t1.subcat_4 = m4.id 
    LEFT JOIN tbl_categories AS m5 ON t1.subcat_5 = m5.id 
    LEFT JOIN tbl_categories AS m6 ON t1.subcat_6 = m6.id 
    LEFT JOIN tbl_categories AS m7 ON t1.subcat_7 = m7.id 
    LEFT JOIN tbl_categories AS m8 ON t1.subcat_8 = m8.id 
    LEFT JOIN tbl_categories AS m9 ON t1.subcat_9 = m9.id 
    WHERE 
    m1.slug = 'english_1394435671' OR 
    m2.slug = 'english_1394435671' OR 
    m3.slug = 'english_1394435671' OR 
    m4.slug = 'english_1394435671' OR 
    m5.slug = 'english_1394435671' OR 
    m6.slug = 'english_1394435671' OR 
    m7.slug = 'english_1394435671' OR 
    m8.slug = 'english_1394435671' OR 
    m9.slug = 'english_1394435671' 

要知道如果用戶屬於主類別,該查詢將是短的,因爲僅存在3個主要的C用戶可以屬於的屬性。 希望這可以幫助別人!

1

有一個更好的辦法:

您的tbl_categories結構細。

添加您存儲用戶數據的另一種結構:

id username password 

每個用戶都將被一次存儲在這裏。然後添加一個「支點」 - 或翻譯,表USERS_CATEGORIES同時連接您的usercategories表:

userID categoryID 

每個用戶可以存儲比一次更在這裏,例如對於三大類三次。

如果你想獲得的所有分類名用戶是你會做這樣的查詢:

SELECT tbl_categories.category_name 
FROM tbl_categories, USERS_CATEGORIES, USERS 
WHERE USERS.username = 'My Name' 
AND USERS.id = USERS_CATEGORIES.userID 
AND USERS_CATEGORIES.categoryID = tbl_categories.id 

的理論背景被稱爲「數據庫規範化」 - 見here

+0

你忘了限制,每個用戶必須在3個或更少的類別和3個或更少的子類別 – danechkin 2014-11-08 15:02:39

+0

不,我在'USERS_CATEGORIES'中有。您可以爲不同的類別多次添加相同的用戶ID。要區分主類別和子類別,您可以在'USERS_CATEGORIES'中添加一些標誌,例如 – Benvorth 2014-11-08 15:18:24

+0

@Benni我在問題中建議的方式要求將類別插入到用戶信息所在的同一個表中。這意味着當用戶提交表單時,他/她的詳細信息+類別詳細信息僅存儲在一個表中的一個插入操作中。爲一個用戶創建一個可能有12條記錄(3 + 9)的類別的不同表格的動機是什麼? – 2014-11-10 07:03:49