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

罗伯·兰德奎斯特

我一直在为一个项目学习PHP和MySQL,而我在这部分中苦苦挣扎。为了简单起见,我只列出相关字段(实际上在db中还有更多),假设我有3个表。

Table1
---------------------
Index | Name | email
1     | Rob  | [email protected]
2     | Kevin| [email protected]
3     | Amy  | [email protected]

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

因此,表1保留了用户信息,并且是主表

表2用户在字段中输入一些数据,然后在准备好后提交批准。(稍后我将使用Submitted for functions的值)如果用户尚未提交信息,则没有记录。这与Table1是1对1

表3用户输入5个目标的信息。在任何给定时间,可能会为用户输入0到最多5个目标。提交的内容与以后的处理相同。该表与表1是多对一的。目标字段从字面上显示数字1到5,有一个单独的字段保存目标文本,在此示例中不需要。

所需的输出是HTML表

Name   |  email          | info |Goal1|Goal2|Goal3|Goal4|Goal5|
Rob    | [email protected]   | Blah |   1 |   2 |  3  |  4  |  5  |
Kevin  | [email protected] | Yada |     |     |     |     |     |              
Amy    | [email protected]   |      |   1 |     |  3  |  4  |     |

不知道空白是否被视为NULL或其他原因,因为它们在数据库中不存在。我想在字段中输入*。基本上,Submitted将用于代码以使字段具有超链接,因此它们需要成为查询的一部分,只是不在表显示中,但如果有帮助,则可以显示它。

 Name   |  email          | info |Goal1|Goal2|Goal3|Goal4|Goal5|
 Rob    | [email protected]   | Blah |   1 |   2 |  3  |  4  |  5  |
 Kevin  | [email protected] | Yada |   * |   * |  *  |  *  |  *  |
 Amy    | [email protected]   |   *  |   1 |  *  |  3  |  4  |  *  |

我正在使用带有左联接和group_concat的查询,但这不适用于不存在的数据,并且我无法弄清楚如何在不进行某些疯狂串联的情况下包括Submitted字段,然后将所有内容分开放入HTML中领域。

我可以包含一些代码,但是由于使用了很多变量,因此可能很难遵循。

我仅使用table1和table3获得的最好成绩:Rob 1,2,3,4,5 Kevin Amy 1,3,4

由于没有考虑尚未输入的记录,因此几乎不可能将数据字符串转换为表。如果我能在每个位置显示一些东西,即使它还不存在,我也知道如何将其显示到html表中。

我希望这是有道理的,有人可以帮助我。

Ashokkumar M.Prajapati

正如您所说的,您最多有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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章