Php 从3个MySQL表获取数据

Php 从3个MySQL表获取数据,php,mysql,sql,join,Php,Mysql,Sql,Join,我在试图从3个数据库表中获取一些数据时遇到了困难 其思想是用户可以用几个字段填写他们的配置文件,我将每个配置文件字段、字段值和用户选择的值存储在单独的表中 表的结构如下所示: Table 'profile_fields' - id - name - sort - status (enum '0', '1') Table 'profile_field_values' - id - profile_field_id - name Table 'user_profile_fields' - use

我在试图从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\u fields”中的所有字段以及“user\u profile\u fields”中用户选择的选项。如果用户尚未选择值,则该值应为null

这是我目前为止的非功能性查询:

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\u field\u 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

看起来简单的连接应该有效:

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

这使用内部联接从每个表中选择所有匹配的记录-查看帖子以区分内部联接和外部联接。

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

表'profile_fields'

身份证件 名称 分类 状态枚举“0”、“1” 表“配置文件\字段\值”

身份证件 用户id 配置文件\字段\ id 价值
为什么有3个表?

我在这里遇到了一个难题,试图从3个数据库表中获取一些数据。你在挣扎中尝试了什么,用你的一些代码更新你的问题。另请注意,在枚举中使用数字时要小心。确保您对enum的查询被正确引用。@James,是的,我发现了。起初,我收到一个错误,因为我没有引用该值。谢谢:-非常感谢!我知道解释连接的方法,但上次我查阅它时,我似乎不明白,但我想我可以再试一次:-然而,我试图让它与左连接一起工作。那不行吗?再次感谢你@user1169875-您完全可以使用外部联接左联接-只需替换内部联接即可。这将返回profile_fields表中的所有记录,即使其他两个表中没有匹配项。祝你好运@用户1169875-np,很高兴它有帮助。干杯嘿,在本节中,我只是尝试用LEFT替换INNER:INNER JOIN profile_field_values pfv,以获取所有字段的字段名,但它仍然只返回匹配的行。我做错了什么?@user1169875-尝试用左连接替换两个内部连接,而不仅仅是一个。您好。我这样做是为了能够轻松添加新的可选值。这些值将放在一些选择框中,供用户选择:-