Mysql Join зацикливание горизонтальное

0

Первая таблица данных сотрудников

|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 означает, что человек идет на работу, пустые средства не приходят на работу.

можете ли вы помочь мне в этом, о том, как запросить его соединение и как отображать итерацию по внешнему виду?

  • 0
    Превращение данных в имена столбцов называется «поворот».
  • 0
    Но это не то, что вы хотите сделать здесь. Вместо этого решайте вопросы отображения данных в коде приложения.
Теги:

1 ответ

1
Лучший ответ

Может быть, причудливый способ это сделать, но я бы сделал это так

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

Я группирую идентификаторы сотрудников и использую сумму (если (чтобы определить, работали ли они в тот день или нет.

Вот динамический метод -

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;

Дополнительная информация о динамическом методе, доступном здесь.

  • 0
    таким образом, он работает для статических данных, как это, но как для динамических данных, если я пишу дату 2018-05-01 до 2018-05-31, ну как в следующем месяце, как? я должен переписать 2018-06-01 к 2018-06-30?
  • 0
    FWIW, я бы не стал
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню