Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 要在特定列的组中显示的SQL语句_Php_Mysql_Sql_Database_Phpmyadmin - Fatal编程技术网

Php 要在特定列的组中显示的SQL语句

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(在

我目前在创建基于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日星期二伊克巴尔 我知道我的陈述中遗漏了一些东西,以及我如何做到这一点


感谢您的帮助。

您可以通过使用单独的移位过滤器连接块表两次来获得所需的结果

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>&nbsp;/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表联接。好的,我将尝试查找您的答案。感谢您的指导:)