Mysql Join循环水平

时间:2018-05-30 04:39:58

标签: mysql

员工数据的第一个表

|ids| name     |
+=============+
|1 | Ibrahim  |
|2 | Rizky    |
|3 | David    |

第二个上班的人

|id| ids | date       |
+========+============+
|1 | 1   | 2018-05-01 |
|2 | 2   | 2018-05-01 |
|3 | 3   | 2018-05-01 |
|4 | 1   | 2018-05-02 |
|5 | 3   | 2018-05-02 |
|6 | 1   | 2018-05-03 |
|6 | 2   | 2018-05-03 |
|7 | 1   | 2018-05-04 |
|8 | 2   | 2018-05-04 |
|9 | 3   | 2018-05-04 |

我想要的结果,或多或少像这样

|name    | 2018-05-01 | 2018-05-02 | 2018-05-03 | 2018-05-04 |
=========+============+============+==-=========+============+
|Ibrahim |      1     |    1       |      1     |    1       |
|Rizky   |      1     |            |      1     |    1       |
|David   |      1     |    1       |            |    1       |

你能帮助我吗,我想显示这样的数据,下面的日期写的是部分例子,我希望从第一个月到月底整整一个月。 1表示此人上班,空表示不上班。

你可以帮我解决一下这个问题,如何查询它的连接以及如何在它的外观中显示迭代?

1 个答案:

答案 0 :(得分:1)

可能有一种奇特的方式,但我会这样做like this

select
 e.name,
 if(sum(if(w.date = '2018-05-01',1,0))=0,null,1) as '2018-05-01',
 if(sum(if(w.date = '2018-05-02',1,0))=0,null,1) as '2018-05-02',
 if(sum(if(w.date = '2018-05-03',1,0))=0,null,1) as '2018-05-03',
 if(sum(if(w.date = '2018-05-04',1,0))=0,null,1) as '2018-05-04',
 if(sum(if(w.date = '2018-05-05',1,0))=0,null,1) as '2018-05-05',
 if(sum(if(w.date = '2018-05-06',1,0))=0,null,1) as '2018-05-06',
 if(sum(if(w.date = '2018-05-07',1,0))=0,null,1) as '2018-05-07'
from employee e
left join work w ON e.ids = w.ids
group by e.ids

我对员工ID进行分组,并使用总和(如果(确定他们当天是否有效)。

这是动态方法 -

SET @s := (SELECT GROUP_CONCAT(DISTINCT CONCAT('if(sum(if(w.date = "',
                        date,
                        '",1,0))=0,null,1) AS `',
                        date,'`'
                        )
                    ) from work);
SET @s := concat('select e.name, ',@s,' from employee e 
         left join work w ON e.ids = w.ids
         group by e.ids');
PREPARE stmt FROM @s;
EXECUTE stmt;

有关动态方法available here的更多信息。