mysql连接水平循环

bvjveswy  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(302)

第一张员工数据表

|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表示人去上班,空表示不来上班。
关于如何查询它的联接以及如何在其外观中显示迭代,您能帮助我吗?

qzlgjiam

qzlgjiam1#

也许有一个很好的方法,但我会这样做

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分组,并使用sum(if)来确定他们当天是否工作。
这里是动态方法-

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;

有关动态方法的更多信息,请参见此处。

相关问题