1

我有一个用作资源在线调度的数据库。数据库设置有以下表(注意:表名是第一个要点,列名在每个表名下缩进):

  • 顾问
    • 顾问 ID
    • f_name
    • l_name
    • 用户名
    • 密码
  • 客户
    • client_id
    • 客户名称
  • 事件类型
    • event_id
    • 事件类型
    • event_full_name
  • 计费状态
    • billing_id
    • 计费类型
  • 日期(请注意,此表中列出了所有可用日期,但是有些日期无法用于我的目的,因此此处并未列出每一天。将其视为可用天数的清单。)
    • date_id
    • 日期
  • 日历事件
    • calendar_event_id
    • 顾问 ID
    • client_id
    • event_id
    • billing_id
    • date_id

每次将顾问分配给事件时,都会将其添加到 calendar_event 表中,并calendar_event_id创建一个新的。

在我的 PHP 页面上,我有以下查询:

$query = "SELECT * FROM billing_status, calendar_event, client, consultant, dates, event_type  WHERE (consultant.consultant_id = calendar_event.consultant_id AND client.client_id = calendar_event.client_id AND event_type.event_id = calendar_event.event_id AND billing_status.billing_id = calendar_event.billing_id AND dates.date_id = calendar_event.date_id) ORDER BY calendar_event.date_id";
    $consultantresults = mysql_query($query) or die ('Query failed: ' . mysql_error()); 

然后我显示输出如下:

echo "<html><head></head><body><table>"; 
while ($consultantresult=mysql_fetch_array($consultantresults))
{
    $consultantname = $consultantresult[f_name];
    $consultantname .= " ";
    $consultantname .= $consultantresult[l_name]; // to display the first and last names together

echo "<tr style=\"background-color:#eee;\"><th>Date</th><th>" . $consultantname . "</th></tr>
<tr><td>" . date('D M d, Y', strtotime($consultantresult[date])) . "</td><td>" . $consultantresult[client_name] . " " . $consultantresult[event_type] . "</td></tr>";
}
echo "</table></body></html>";
} else {
header("Location: /index.php");
exit;
}

这可以显示calendar_event表中包含的所有记录,但每条记录都显示在自己的行中,例如:

<table>
<tr style="background-color:#eee;"><th>Date</th><th>Consultant #1</th></tr>
<tr><td>Mon Aug 05, 2013</td><td>Client A</td></tr>
<tr style="background-color:#eee;"><th>Date</th><th>Consultant #2</th></tr>
<tr><td>Mon Aug 05, 2013</td><td>Client B</td></tr>
<tr style="background-color:#eee;"><th>Date</th><th>Consultant #3</th></tr>
<tr><td>Mon Aug 05, 2013</td><td>Client C</td></tr>
<tr style="background-color:#eee;"><th>Date</th><th>Consultant #1</th></tr>
<tr><td>Tue Aug 06, 2013</td><td>Client D</td></tr>
</table>

您会注意到前三个条目是在同一日期(日期每次都重复),第一个和最后一个条目是针对同一个顾问(姓名也重复)。

相反,我想让表格在顶部标题行中显示每个唯一顾问的姓名,在第一列中显示每个唯一日期。在第一行/列中不应重复任何名称或日期。例如:

<table>
<tr style="background-color:#eee;"><th>Date</th><th>Consultant #1</th><th>Consultant #2</th><th>Consultant #3</th></tr>
<tr><td>Mon Aug 05, 2013</td><td>Client A</td><td>Client B</td><td>Client C</td></tr>
<tr><td>Tue Aug 06, 2013</td><td>Client D</td><td>&nbsp;</td><td>&nbsp;</td></tr>
</table>

顾问可能不会在某一天被分配,所以那一天对他们来说是空白的(我用作&nbsp;占位符)。

calendar_event我还需要为最终用户提供一种只显示特定日期的方式,而不是显示整个表格中的每个条目。

有什么想法可以修改上面的代码以使其正确显示输出吗?

4

3 回答 3

0

你听说过SQL JOIN吗?

使用这个您的查询应该是:

SELECT * 
FROM calendar_event ce
LEFT JOIN billing_status bs ON ce.billing_id = bs.billing_id
LEFT JOIN client cl ON ce.client_id = cl.client_id
LEFT JOIN consultant co ON ce.consultant_id = co.consultant_id
LEFT JOIN dates dt ON ce.date_id = dt.date_id
LEFT JOIN event_type et ON ce.event_id et.event_it 
ORDER BY ce.date_id

此外,如果您查看dates表中的日期,您会发现每个数据本身都应该是唯一的,因此不需要也有唯一的主键date_id,而只有date应该是主列。

于 2013-06-21T14:17:06.923 回答
0
I have not tested this code you need to do something like

    echo "<html><head></head><body><table>"; 

$out="";

$preDate="";
while ($consultantresult=mysql_fetch_array($consultantresults))
{
    $consultantname = $consultantresult[f_name];
    $consultantname .= " ";
    $consultantname .= $consultantresult[l_name]; // to display the first and last names together
    if($preDate!=date('D M d, Y', strtotime($consultantresult[date])))
   {
        if($out!="")
            echo $out."</td></tr>";        
        echo "<tr style=\"background-color:#eee;\"><th>Date</th><th>" . $consultantname . "</th></tr><tr><td>";
        $preDate= date('D M d, Y', strtotime($consultantresult[date]));
   echo date('D M d, Y', strtotime($consultantresult[date])) . "</td><td>";
     $out="";
   }
else
  {
     $out.=$consultantresult[client_name] . " " . $consultantresult[event_type];  
  }

}
echo "</table></body></html>";
} else {
header("Location: /index.php");
exit;
}
于 2013-06-21T14:25:48.720 回答
0

简答使用joins。这将使您能够执行您的逻辑。

如果由于某种原因这是不可能的。您还可以在 PHP 代码中处理您的结果集,以便按照您认为合适的方式进行组织和操作。

于 2013-06-21T14:14:02.963 回答