0

我无法以有效的方式打印出考勤表。这样做可能有一个术语,但我不知道它会是什么,所以我在寻找解决方案时遇到了麻烦。数据透视表很接近,但还不够。

我有一个这样布局的 MySQL 数据库(简化):

Log_events(event_id, event_name, ...)
Log_members(member_id, member_name, ...)
Log_attendance(member_id, event_id, ...)

Log_events 包含事件的所有数据,Log_members 包含每个成员的所有数据,Log_attendance 具有每次成员参加事件时的双 ID 条目。

我正在尝试打印一个表格(带有 PHP 的 HTML 表格),其中所有事件都作为列,然后所有成员作为行。然后,使用 log_attendance 表,我会在成员参加活动的每个表格单元格中打印一个勾号或一些信息,有点像这样:

姓名 | 事件1 | 事件2 | 事件3
----------------------------------
会员1 | X | X | X
会员2 | | X |
会员3 | X | | X

在没有大量嵌套查询的情况下,我无法弄清楚如何做到这一点。我将如何有效地做到这一点?

这是我试图打印出来的那种东西的一个例子: http ://www.worldoflogs.com/guilds/30890/character/

4

2 回答 2

0

我认为最好的方法是查询每个不同的事件并检索参加它的成员:

$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.
     }
}

根据您要打印的表格,您可以以相反的方式进行:

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

于 2013-05-28T15:58:28.597 回答
0

我设法使它工作。从发布的 Clockwork-Muse 链接中,我找到了 MySQL 函数 GROUP_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 语句来限制结果的大小,因此它不会变得太慢。

于 2013-05-29T19:59:58.387 回答