Php 要在特定列的组中显示的SQL语句
我目前在创建基于web的调度系统的项目中。我想从数据库中获取数据,并将其显示在表中(计划格式) 在数据库中,我有两个表 schedule id date day 1 22/09/2014 Monday 2 23/09/2014 Tuesday 日程 身份证日期 1 2014年9月22日星期一 2 2014年9月23日星期二 块 区块id计划\u id工人轮班 1艾哈迈德1 2 1阿卜杜勒1 3 1法里斯2 4 2伊克巴尔2 日程安排的每一天都有几个区块,并且日程安排id(在区块中)是指它应该是哪一天。Coloumn shift(在区块中)将区块定义为早晨(班次=1)和晚上(班次=2) 我想展示这样的东西 date day Morning Evening 22/09/2014 Monday Ahmad Faris Abdul 23/09/2014 Tuesday Iqbal 日期白天上午晚上 2014年9月22日星期一Ahmad Faris 阿卜杜勒 2014年9月23日星期二伊克巴尔 我曾尝试创建sql语句,如 SELECT schedule.date, schedule.day, block.worker FROM schedule LEFT JOIN block ON schedule.id = block.schedule_id 选择schedule.date、schedule.day、block.worker 按计划 左连接块 ON schedule.id=block.schedule\u id 但是表格的格式不合适 date day Morning Evening 22/09/2014 Monday Ahmad 22/09/2014 Monday Abdul 22/09/2014 Monday Faris 23/09/2014 Tuesday Iqbal 日期白天上午晚上 2014年9月22日星期一艾哈迈德 2014年9月22日星期一阿卜杜勒 2014年9月22日星期一法里斯 2014年9月23日星期二伊克巴尔 我知道我的陈述中遗漏了一些东西,以及我如何做到这一点Php 要在特定列的组中显示的SQL语句,php,mysql,sql,database,phpmyadmin,Php,Mysql,Sql,Database,Phpmyadmin,我目前在创建基于web的调度系统的项目中。我想从数据库中获取数据,并将其显示在表中(计划格式) 在数据库中,我有两个表 schedule id date day 1 22/09/2014 Monday 2 23/09/2014 Tuesday 日程 身份证日期 1 2014年9月22日星期一 2 2014年9月23日星期二 块 区块id计划\u id工人轮班 1艾哈迈德1 2 1阿卜杜勒1 3 1法里斯2 4 2伊克巴尔2 日程安排的每一天都有几个区块,并且日程安排id(在
感谢您的帮助。您可以通过使用单独的移位过滤器连接块表两次来获得所需的结果
SELECT
s.date,
s.day,
b.worker Morning,
bb.worker Evening
FROM
SCHEDULE s
LEFT JOIN block b
ON s.id = b.schedule_id
AND b.`shift` = 1
LEFT JOIN block bb
ON s.id = bb.schedule_id
AND bb.`shift` = 2
ORDER BY s.date
关于您所显示的格式,可以通过使用用户定义的变量进行查询来实现,并且重复的数据可以显示为null,但是这个查询将变得非常难看,而且优化也无法保证。最好在应用程序级代码(即php)中这样做
根据评论编辑
在php中,只需使用逻辑在每个组中只显示一次日期,即可从查询中获取结果
$results =fetchfromquery(query);
$currentParent = false;
echo '<table>';
echo '<tr>
<td>Date</td>
<td>Day</td>
<td>Morning</td>
<td>Evening</td>
</tr>';
foreach ($results as $r) {
echo '<tr>';
if ($currentParent != $r['date']) {
echo '<td>' . $r['date'] . '</td>';
$currentParent = $r['date'];
}else{
echo '<td> /td>';
}
echo '<td>' . $r['day'] . '</td>';
echo '<td>' . $r['Morning'] . '</td>';
echo '<td>' . $r['Evening'] . '</td>';
echo '</tr>';
}
echo '</table>';
$results=fetchfromquery(查询);
$currentParent=false;
回声';
回声'
日期
白天
早晨
傍晚
';
foreach(结果为$r){
回声';
如果($currentParent!=$r['date'])){
回显'.$r['date'].';
$currentParent=$r['date'];
}否则{
回声“/td>”;
}
回音“.$r['day']”;
回音“.$r['Morning']”;
回音“.$r[“晚上]”;
回声';
}
回声';
上面将以表格格式输出数据,如下所示
<table>
<tr><td>Date</td> <td>Day</td> <td>Morning</td> <td>Evening</td></tr>
<tr><td>22/09/2014</td> <td>Monday</td> <td>Abdul</td> <td>Faris</td></tr>
<tr><td> </td> <td>Monday</td> <td>Ahmad</td> <td>Faris</td></tr>
<tr><td>23/09/2014</td> <td>Tuesday</td> <td> </td> <td>Iqbal</td></tr>
</table>
日期白天上午晚上
2014年9月22日星期一Abdul Faris
星期一艾哈迈德·法里斯
2014年9月23日星期二伊克巴尔
最初,我想到的是:
SELECT s.date, s.day, COALESCE(GROUP_CONCAT(bm.worker SEPARATOR ' '),'') as Morning,COALESCE(GROUP_CONCAT(be.worker SEPARATOR ' '),'') as Evening
FROM schedule s LEFT JOIN
block bm ON s.id = bm.schedule_id AND bm.shift=1 LEFT JOIN
block be ON s.id = be.schedule_id AND be.shift=2
GROUP BY s.date,s.day
结果:
DATE DAY MORNING EVENING
22/09/2014 Monday Ahmad Abdul Faris Faris
23/09/2014 Tuesday Iqbal
DATE DAY MORNING EVENING
22/09/2014 Monday Ahmad Abdul Faris
23/09/2014 Tuesday Iqbal
导致
正如您所看到的,黄昏字段包含两次法里斯。因此,我使用了两个查询并合并了这些结果。像这样:
SELECT T1.date,T1.day,COALESCE(T1.Morning,'') as Morning,COALESCE(T2.Evening,'') as Evening FROM
(SELECT s.date, s.day, GROUP_CONCAT(bm.worker SEPARATOR ' ') as Morning
FROM schedule s LEFT JOIN
block bm ON s.id = bm.schedule_id AND bm.shift=1
GROUP BY s.date,s.day) T1
JOIN
(SELECT s.date, s.day,GROUP_CONCAT(be.worker SEPARATOR ' ') as Evening
FROM schedule s LEFT JOIN
block be ON s.id = be.schedule_id AND be.shift=2
GROUP BY s.date,s.day) T2
ON T1.Date=T2.Date AND T1.Day=T2.Day
结果:
DATE DAY MORNING EVENING
22/09/2014 Monday Ahmad Abdul Faris Faris
23/09/2014 Tuesday Iqbal
DATE DAY MORNING EVENING
22/09/2014 Monday Ahmad Abdul Faris
23/09/2014 Tuesday Iqbal
请参阅中的结果
说明:
我们分别选择早上和晚上,然后我们将这两个表与日期和日期连接起来。最后从连接的查询中获取结果
GROUP\u CONCAT
用于对具有相同日期的字段进行分组。我们可以使用分隔符“”
作为空格分隔符。如果删除分隔符“”,将得到逗号(,)分隔的结果
COALESCE
用于将空值替换为空字符串('
)。是否需要诸如“GROUP by”之类的语句,因为我只想在包含多个块的行中显示一个日期和一天。。(就像我想要的格式)@请看我回答的最后一部分,这就是我所说的重复数据,您只需要按日期排序,在应用程序级代码循环中通过记录和循环内检查,或者重复数据并仅显示once@iqbalplague请看我对这个问题的回答,我是如何做循环来检查重复数据的,这与您使用的逻辑相同实现上面的查询,这是我看到的另一个答案,所以重复的功能是在应用程序级别完成的。谢谢你的指导,我会努力的:)嗨,我一直在尝试使用你的答案,但似乎没什么问题。我一直在应用程序级别使用循环代码,但接口不合适。我可以请教您的指导吗?@iqbalpirate:您可以在小提琴示例中看到结果。我如何在不同的行中显示它,是否需要任何标记?(例如)@iqbalpilt:在不同的行中?其他字段为空?SQL不是这样工作的。在这种情况下,我希望使用逗号分隔的值。实际上,我将使用worker_id而不是worker name,并将它们与其他worker表联接。好的,我将尝试查找您的答案。感谢您的指导:)