加入多个外键

时间:2014-11-08 08:43:33

标签: mysql sql database database-schema

我有一个 tbl_categories 表,如下所示:

id  category_name   parent_id   status  category_order  slug 

我有另一个表 tbl_users ,其中每个用户记录最多可以属于3个主要类别,每个主要类别有3个子类别(因此,总共3个主要和9个子类别)

我知道我可以在 tbl_users 表中使用别名并创建我的查询,该查询将返回用户所属的类别和子类别。但是,我能想到的 tbl_users 表的表结构如下所示:

  

id username password 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

有更好的结构/方法吗?

2 个答案:

答案 0 :(得分:1)

有一种更好的方法:

tbl_categories的结构很好。

添加另一个用于存储用户数据的结构:

id username password 

每个用户将在此处存储一次。然后添加“pivot” - 或翻译表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

答案 1 :(得分: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个主要类别。 希望这有助于某人!