连接多个MySQL表,其中一个表中的某些数据可能不存在

问题描述 投票:0回答:1

我将 5 个表放在一起,进行一个相当复杂的表单生成器查询。该构建器允许站点管理员创建表单、创建字段并将这些字段添加到任何表单中,然后在前端为用户显示表单(用户提交表单后,他们可以随时进去编辑值) ; 想想类似于配置文件的工作方式)。

我面临的问题是,由于管理员甚至可以在提交后编辑表单以添加新字段,因此当我为编辑现有提交的人拉入新字段时,它确实会获取新字段,但是它与按其进入顺序位于其之前的字段具有相同的值。我怀疑这是因为当

submission_fields
form_fields
连接时,它没有正确地进行空合并并在
field_id
 上添加分隔符field_value
,但我不确定。

表格

id 标题
1 表格1
2 表格2

田野

id 标签
1 名字
2 姓氏
3 电子邮件地址

form_fields(链接表)

id form_id 字段_id
1 1 1
2 1 2
3 1 3

提交

id form_id
1 1
2 1

submission_fields(链接表)

id 字段_id 字段值
1 1
2 2 史密斯

查询:

SELECT
    submissions.id AS submission_id,
    submissions.form_id AS form_id,
    forms.title AS form_title,
    GROUP_CONCAT(COALESCE(form_fields.field_id, '') SEPARATOR '|') AS form_fields_field_ids,
    GROUP_CONCAT(COALESCE(fields.label, '') SEPARATOR '|') AS field_labels,
    GROUP_CONCAT(COALESCE(submission_fields.field_id, '') SEPARATOR '|') AS field_ids,
    GROUP_CONCAT(COALESCE(submission_fields.field_value, '') SEPARATOR '|') AS field_values
FROM
    submissions
LEFT OUTER JOIN
    forms
ON
    forms.id = submissions.form_id
LEFT OUTER JOIN
    form_fields
ON
    form_fields.form_id = submissions.form_id
LEFT OUTER JOIN
    submission_fields
ON
    submission_fields.submission_id = submissions.id
LEFT OUTER JOIN
    fields
ON (
    fields.id = submission_fields.field_id OR
    fields.id = form_fields.field_id
)
WHERE
    submissions.id = :id;

当 Joe Smith 正在编辑他在添加 Email Address 字段之前提交的个人资料时运行此查询时,它将像这样返回:

[submission_id] => 1,
[form_id] => 1
[form_title] => 'Form 1',
[form_fields_field_ids] => '1|2|3',
[field_labels] => 'First Name|Last Name|Email Address',
[field_ids] => '1|2|2',
[field_values] => 'Joe|Smith|Smith'

本例中的 
field_ids

field_values
应分别如下所示:
1|2|
Joe|Smith|
谢谢!

mysql pdo mariadb
1个回答
0
投票

要解决此问题,您可以修改查询以明确区分表单字段和提交字段。以下是调整查询的方法:

SELECT submissions.id AS submission_id, submissions.form_id AS form_id, forms.title AS form_title, GROUP_CONCAT(COALESCE(form_fields.field_id, '') SEPARATOR '|') AS form_fields_field_ids, GROUP_CONCAT(COALESCE(form_fields.label, '') SEPARATOR '|') AS field_labels, GROUP_CONCAT(COALESCE(submission_fields.field_id, '') SEPARATOR '|') AS submission_field_ids, GROUP_CONCAT(COALESCE(submission_fields.field_value, '') SEPARATOR '|') AS submission_field_values FROM submissions LEFT OUTER JOIN forms ON forms.id = submissions.form_id LEFT OUTER JOIN form_fields ON form_fields.form_id = submissions.form_id LEFT OUTER JOIN submission_fields ON submission_fields.submission_id = submissions.id WHERE submissions.id = :id GROUP BY submissions.id;

我所做的改变: 1.删除了与字段表的连接,因为此查询不需要它。 1.将field_ids

field_values
重命名为
submission_field_ids
submission_field_values
,以表明它们专门用于用户提交的字段 2.按
submissions.id
对结果进行分组,以确保每次提交都由结果集中的一行表示。
我希望这对你有用。我没有测试它,因为我没有时间用你的表创建数据库。

© www.soinside.com 2019 - 2024. All rights reserved.