2014-11-08 90 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