![](/img/trans.png)
[英]PHP Mysql update multiple columns with multiple row values by single query
[英]MySQL and PHP One to Many Return Data in Single Row, Multiple Columns
我一直在学习PHP和MySQL的项目,我正在努力解决这个问题。 为了简单起见,我将仅列出相关字段(实际上在实际数据库中实际上更多),假设我有3个表。
Table1
---------------------
Index | Name | email
1 | Rob | rob@email.com
2 | Kevin| kevin@email.com
3 | Amy | amy@email.com
Table2
------------------------
id | Info | Submitted
1 | Blah | 0
2 | Yada | 1
Table 3
-------------------------
id | Goal |Submitted
1 | 1 | 1
1 | 2 | 1
1 | 3 | 1
1 | 4 | 0
1 | 5 | 0
3 | 1 | 0
3 | 3 | 1
3 | 4 | 1
因此,Table1保存用户信息,并且是主表
表2用户在字段中输入一些数据,然后在准备好时提交批准。 (我稍后将使用“已提交函数”的值)如果用户尚未提交信息,则表示没有记录。 这是Table1的1比1
表3用户输入5个目标的信息。 在任何给定时间,可以为用户输入0到最多5个目标。 提交的内容与以后的处理相同。 这个表与Table1是多对一的。 目标字段字面上显示数字1到5,有一个单独的字段保存目标文本,在此示例中不需要。
期望的输出是HTML表
Name | email | info |Goal1|Goal2|Goal3|Goal4|Goal5|
Rob | rob@email.com | Blah | 1 | 2 | 3 | 4 | 5 |
Kevin | kevin@email.com | Yada | | | | | |
Amy | amy@email.com | | 1 | | 3 | 4 | |
不确定空白是否被视为NULL或其他内容,因为它们不存在于DB中。 我想在场上放一些像*的东西。 基本上,Submitted将用于代码以使字段成为超链接,因此它们需要成为查询的一部分,而不是在表格显示中,但如果它有帮助,则可以显示它。
Name | email | info |Goal1|Goal2|Goal3|Goal4|Goal5|
Rob | rob@email.com | Blah | 1 | 2 | 3 | 4 | 5 |
Kevin | kevin@email.com | Yada | * | * | * | * | * |
Amy | amy@email.com | * | 1 | * | 3 | 4 | * |
我正在使用带有左连接和group_concat的查询,但这对于不存在的数据效果不佳,我无法弄清楚如何在不做一些疯狂连接的情况下包含“已提交”字段,然后将所有内容分开放入HTML中领域。
我可以包含一些代码,但由于使用了大量变量,因此可能很难遵循。
我最好只使用table1和table3:Rob 1,2,3,4,5 Kevin Amy 1,3,4
由于未记录未记录的记录,因此几乎不可能将数据字符串转换为表格。 如果我可以为每个位置显示某些内容,即使它还不存在,我也知道如何将其放入html表中。
我希望这是有道理的,有人可以帮助我。
您将希望将每个表一起加入,并将GROUP BY用户加入。
处理目标的一种方法是将其显示为包含所有目标的一列。
这应该可以帮助您入门:
SELECT name,
email,
info,
<LOGIC> as goals
FROM table1
JOIN table2 ON table2.user_id = table1.id
JOIN table3 ON table3.user_id = table1.id
GROUP BY name
您可以使用CASE和CONCAT的混合创建用于目标列的逻辑(如果定义了目标,将其连接成字符串,并将该字符串显示为目标的最终值)。
正如你所说,你最多有5个进球。 最好的选择是使用以下查询。
SELECT t1.Name,t1.email
,CASE WHEN t2.Info IS NULL THEN * ELSE t2.Info END as Info
,CASE WHEN g1.Goal IS NULL THEN * ELSE g1.Goal END as Goal1
,CASE WHEN g2.Goal IS NULL THEN * ELSE g2.Goal END as Goal2
,CASE WHEN g3.Goal IS NULL THEN * ELSE g3.Goal END as Goal3
,CASE WHEN g4.Goal IS NULL THEN * ELSE g4.Goal END as Goal4
,CASE WHEN g5.Goal IS NULL THEN * ELSE g5.Goal END as Goal5
FROM Table1 as t1
LEFT JOIN Table2 as t2 ON t2.id = t1.Index
LEFT JOIN Table3 as g1 ON g1.id = t1.Index AND g1.Goal=1
LEFT JOIN Table3 as g2 ON g2.id = t1.Index AND g2.Goal=2
LEFT JOIN Table3 as g3 ON g3.id = t1.Index AND g3.Goal=3
LEFT JOIN Table3 as g4 ON g4.id = t1.Index AND g4.Goal=4
LEFT JOIN Table3 as g5 ON g5.id = t1.Index AND g5.Goal=5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.