我有一个 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
有更好的结构/方法吗?
答案 0 :(得分:1)
有一种更好的方法:
tbl_categories
的结构很好。
添加另一个用于存储用户数据的结构:
id username password
每个用户将在此处存储一次。然后添加“pivot” - 或翻译表USERS_CATEGORIES
以连接您的user
和categories
表:
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个主要类别。 希望这有助于某人!