0

我在这里尝试从 3 个数据库表中获取一些数据时遇到了困难。

这个想法是用户可以用几个字段填写他们的个人资料,我将每个个人资料字段、字段值和用户选择的值存储在单独的表中。

表的结构如下所示:

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

如果你能告诉我如何构造这个查询,以及你为什么使用你所做的 JOIN,那就太好了。

此外,当用户群增长时,此表格布局将如何扩展?

非常感谢您!

编辑:好的,我仍然不知道如何让它返回'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
4

2 回答 2

0

我认为你有一些不必要的复杂性。也许你应该试试

表'profile_fields'

  • ID
  • 姓名
  • 种类
  • 状态(枚举'0','1')

表'profile_field_values'

  • ID
  • 用户身份
  • profile_field_id
  • 价值

为什么有3张桌子?

于 2013-09-21T01:44:46.090 回答
-1

似乎简单的 JOIN 应该可以工作:

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

SQL 连接的可视化解释

这使用 anINNER JOIN从每个表中选择所有匹配的记录 - 查看帖子以区分 anINNEROUTERjoin 之间的区别。

于 2013-09-21T01:26:45.400 回答