我有一个数据库,可用作资源的在线调度。使用以下表格设置数据库(注意:表名是第一个项目符号点,列名在每个表名下缩进):
每次将顾问分配给某个活动时,都会将其添加到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> </td><td> </td></tr>
</table>
有可能在某一天没有分配顾问,因此那天他们就是空白(我使用
作为占位符)。
我还需要为最终用户提供仅显示某些日期的方式,而不是整个calendar_event
表中的每一个条目。
如何修改上面的代码以使其正确显示输出?
答案 0 :(得分:0)
简短回答使用joins。这将使您能够执行逻辑。
如果由于某种原因这是不可能的。您还可以在PHP代码中处理结果集,以便根据需要进行组织和操作。
答案 1 :(得分: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
应该是主要列。
答案 2 :(得分: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;
}