【问题标题】:SQL Query for printing a cross-referenced table on a website用于在网站上打印交叉引用表的 SQL 查询
【发布时间】:2013-05-23 16:14:05
【问题描述】:

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

我有一个这样布局的 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/

【问题讨论】:

  • 您对可以显示的事件数量有什么限制吗?
  • 好吧,我的计划是展示一个月的所有事件,每个显示大约 16 个事件
  • 我最终使用了 GROUP_CONCAT,等到所需的 8 小时过去后,我会在这里发布答案。

标签: php mysql sql html-table


【解决方案1】:

我设法让它工作。从发布的 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 语句来限制结果的大小,因此它不会变得太慢。

【讨论】:

    【解决方案2】:

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

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

    根据您要打印的表格,您可以使用其他方式:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      相关资源
      最近更新 更多