繁体   English   中英

MySQL和PHP一对多返回单行,多列中的数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM