Php 用于在网站上打印交叉引用表的SQL查询
我无法高效地打印考勤表。这可能有一个术语,但我不知道它是什么,所以我很难找到解决方案。数据透视表很接近,但还不够 我有一个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 我很难弄清楚如何在没有大量嵌套查询的情况下做到这一点。我如何有效地做到这一点 下面是我想打印出来的一个例子:Php 用于在网站上打印交叉引用表的SQL查询,php,mysql,sql,html-table,Php,Mysql,Sql,Html Table,我无法高效地打印考勤表。这可能有一个术语,但我不知道它是什么,所以我很难找到解决方案。数据透视表很接近,但还不够 我有一个MySQL数据库,布局如下(简化): Log_events包含事件的所有数据,Log_members包含每个成员的所有数据,Log_Attention在成员每次参加事件时都有一个双重id条目 我试图打印出一个表(带有PHP的HTML表),其中所有事件都是列,然后所有成员都是行。然后,使用log_Attention表,我会在成员参加活动的每个表单元格中打印一个勾号或一些信息,类
我认为最好的方法是对每一个不同的活动进行查询,并检索参加活动的成员:
$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