在PHP中显示唯一的MySQL数据

时间:2013-06-21 14:09:11

标签: php mysql

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

  • 顾问
    • consultant_id
    • f_name
    • l_name
    • USER_NAME
    • 密码
  • 客户端
    • 的client_id
    • CLIENT_NAME
  • EVENT_TYPE
    • event_id的
    • EVENT_TYPE
    • event_full_name
  • billing_status
    • BILLING_ID
    • billing_type
  • 日期(请注意,此表中列出了所有可用日期,但有些日期无法用于我的目的,所以不是每天是列在这里。把它想象成可用天数的清单。)
    • DATE_ID
    • 日期
  • calendar_event
    • calendar_event_id
    • consultant_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表中的每一个条目。

如何修改上面的代码以使其正确显示输出?

3 个答案:

答案 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;
}