2016-09-04 5 views
-1

테이블 tbl_worklog에는 id (int), project_id (int), start_time (datetime), total (time), user_id (id)와 같은 테이블이 있습니다.데이터를 mysql을 사용하여 매일 선택하십시오.

또 다른 테이블 tbl_projects에는 id (int), project_name (text), organization_id (int) 열이 있습니다. 첫 번째 테이블의 project_id에는 두 번째 테이블의 id에 대한 외래 키가 있습니다.

organization 테이블에 created_by (int) 테이블이 있습니다. 조직 테이블의 ID에는 두 번째 테이블의 organization_id에 대한 외래 키가 있습니다.

여기에 문제가 있습니다. created_by = 1 인 조직 아래에있는 모든 프로젝트의 구성원을 얻고 싶습니다. 그리고 각 구성원마다 매일 첫 번째 테이블에서 작업을하고 싶습니다. 예 :

Members | Sun | Mon | Tue | Wed | Thu | Fri | Sat | Weekly Total 
--------------- 
John | 0:30:00 | 0:30:00 | 0:30:00 | 0:30:00 | 0:30:00 | 0:30:00 | 1:00:00 | 4:00:00 

일일 작업을 계산할 수 있도록 첫 번째 테이블에서 start_time을 사용했습니다. 여기

가 작동하지 않습니다 내 쿼리,

SELECT (SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(total))) AS total_time from tbl_worklog WHERE start_time < date_add('2016-09-04', INTERVAL 7 DAY) AND start_time >= '2016-09-04' AND user_id=tbl_worklog.user_id) as weekly_total, 
(SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(total))) AS total_time from tbl_worklog WHERE start_time < date_add('2016-09-04', INTERVAL 1 DAY) AND start_time >= '2016-09-04' AND user_id=tbl_worklog.user_id) as sun, 
(SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(total))) AS total_time from tbl_worklog WHERE start_time < date_add('2016-09-04', INTERVAL 2 DAY) AND start_time >= date_add('2016-09-04', INTERVAL 1 DAY) AND user_id=tbl_worklog.user_id) as mon, 
(SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(total))) AS total_time from tbl_worklog WHERE start_time < date_add('2016-09-04', INTERVAL 3 DAY) AND start_time >= date_add('2016-09-04', INTERVAL 2 DAY) AND user_id=tbl_worklog.user_id) as tue, 
(SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(total))) AS total_time from tbl_worklog WHERE start_time < date_add('2016-09-04', INTERVAL 4 DAY) AND start_time >= date_add('2016-09-04', INTERVAL 3 DAY) AND user_id=tbl_worklog.user_id) as wed, 
(SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(total))) AS total_time from tbl_worklog WHERE start_time < date_add('2016-09-04', INTERVAL 5 DAY) AND start_time >= date_add('2016-09-04', INTERVAL 4 DAY) AND user_id=tbl_worklog.user_id) as thu, 
(SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(total))) AS total_time from tbl_worklog WHERE start_time < date_add('2016-09-04', INTERVAL 6 DAY) AND start_time >= date_add('2016-09-04', INTERVAL 5 DAY) AND user_id=tbl_worklog.user_id) as fri, 
(SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(total))) AS total_time from tbl_worklog WHERE start_time < date_add('2016-09-04', INTERVAL 7 DAY) AND start_time >= date_add('2016-09-04', INTERVAL 6 DAY) AND user_id=tbl_worklog.user_id) as sat, 
(SELECT name FROM tbl_accounts WHERE id=tbl_worklog.user_id) as name FROM tbl_worklog WHERE project_id IN (SELECT id FROM tbl_projects WHERE organization_id=1) 

가 간단하고 더 나은 연습을하는 다른 방법도 있습니다입니까? PDO를 사용하여 어떻게 할 수 있습니까?

+0

예. PHP에 대해 언급 했으므로 여기에 디스플레이 문제를 처리하십시오. 훨씬 더 유연하고 확장 성이 있습니다 (이 경우에는 척도가 문제가 될 수는 없습니다) – Strawberry

답변

0

예상 결과를 얻으려면 여기에서 가장 중요한 group by을 사용하지 않았습니다. 다음 쿼리를 사용하여 매일 결과를 얻으십시오. PHP에서 매주 결과보기를 수정하도록 수정할 수 있습니다.

select project_name, user_id, sum(time_to_sec(time)) as user_time, date(start_time) as 
daily_time , tw.project_id pID 
inner join tbl_projects tp on tp.id = tw.project_id 
inner join organization og on og.id = tp.organization_id 
where og.created_by = 1 group by user_id, pID, daily_time 
+0

내 전체 쿼리입니까? 어떻게 그 일원의 일요일 노동 시간을 얻을 수 있습니까? – JMA

+0

쿼리를 실행하고 결과를 확인 했습니까? 그것은 일과 사용자로 행을 줄 것이다. 일부 PHP 로직을 사용하여 7 일마다 열을 얻을 수 있습니다. – Riad

관련 문제