Php 用于在网站上打印交叉引用表的SQL查询

Php 用于在网站上打印交叉引用表的SQL查询,php,mysql,sql,html-table,Php,Mysql,Sql,Html Table,我无法高效地打印考勤表。这可能有一个术语,但我不知道它是什么,所以我很难找到解决方案。数据透视表很接近,但还不够 我有一个MySQL数据库,布局如下(简化): Log_events包含事件的所有数据,Log_members包含每个成员的所有数据,Log_Attention在成员每次参加事件时都有一个双重id条目 我试图打印出一个表(带有PHP的HTML表),其中所有事件都是列,然后所有成员都是行。然后,使用log_Attention表,我会在成员参加活动的每个表单元格中打印一个勾号或一些信息,类

我无法高效地打印考勤表。这可能有一个术语,但我不知道它是什么,所以我很难找到解决方案。数据透视表很接近,但还不够

我有一个MySQL数据库,布局如下(简化):

Log_events包含事件的所有数据,Log_members包含每个成员的所有数据,Log_Attention在成员每次参加事件时都有一个双重id条目

我试图打印出一个表(带有PHP的HTML表),其中所有事件都是列,然后所有成员都是行。然后,使用log_Attention表,我会在成员参加活动的每个表单元格中打印一个勾号或一些信息,类似这样:

Name | Event1 | Event2 | Event3 ---------------------------------- Member1 | X | X | X Member2 | | X | Member3 | X | | X 名称|事件1 |事件2 |事件3 ---------------------------------- 成员1 | X | X | X 成员2 | | X | 成员3 | X | X 我很难弄清楚如何在没有大量嵌套查询的情况下做到这一点。我如何有效地做到这一点

下面是我想打印出来的一个例子:

我认为最好的方法是对每一个不同的活动进行查询,并检索参加活动的成员:

$result=$mysqli->query("SELECT event_id, event_name from Log_events");
while($row=$result->fetch_array()){
     $query="SELECT member_name FROM Log_attendance 
              JOIN Log_members ON Log_members.member_id=Log_attendance.member_id
              WHERE Log_attendance.event_id='$row[0]'
     ";
     $res2=$mysqli->query($query);
     while($member_row=$res2->fetch_array()){
           //Do something with the info. Like store it so you can format the table later.
     }
}
根据要打印的表格,您可以使用其他方式进行打印:


获取成员列表,然后检索他们参加的活动。

我设法使其正常工作。从发条Muse发布的链接中,我找到了MySQL函数组_CONCAT

我的查询现在看起来与此类似:

SELECT a.member_id, p.member_name, c.* 

FROM Log_attendance a NATURAL JOIN Log_events r NATURAL JOIN Log_players p 

LEFT JOIN (
        SELECT a2.member_id pid, GROUP_CONCAT(a2.event_id) all_events 
        FROM Log_attendance a2
    ) c ON c.pid=a.member_id 

GROUP BY a.member_id
(如果有错误,那是因为我不得不手工编辑)


基本上,它将所有事件id连接成一个字符串,如每个成员的“1,2,3,5,9”。在PHP中,我首先检索所有事件,打印列并将每个成员的列表字符串与列的id进行比较。我还有其他WHERE语句来限制结果的大小,这样结果就不会太慢。

可能重复。您对可以显示的事件数量有任何限制吗?我的计划是显示一个月的所有事件,每个显示器大约有16个事件我最终使用了GROUP_CONCAT,当所需的8小时过去后,我将在这里发布答案。
SELECT a.member_id, p.member_name, c.* 

FROM Log_attendance a NATURAL JOIN Log_events r NATURAL JOIN Log_players p 

LEFT JOIN (
        SELECT a2.member_id pid, GROUP_CONCAT(a2.event_id) all_events 
        FROM Log_attendance a2
    ) c ON c.pid=a.member_id 

GROUP BY a.member_id