2009-08-04 17 views
0

db 객체 스타일 쿼리를 사용하여 MySQL 데이터베이스 테이블에서 이미 모든 행을 가져 오는 foreach 루프가 있습니다. 기능. 그 함수는 모든 필드를 잡아서 배열로 설정합니다. foreach ($ blahs는 $ blah => $ blah_data) 이제는 발생하는 각 행에 대해 필드를 페이지에 채울 수 있습니다. 그래서 그것은 작동 중입니다.PHP를 사용하여 MySQL 테이블의 특정 필드의 전체 값을 합산하고 배열 형태로 전체 행을 가져옵니다.

그러나 또한 필자는 이제 관계 ID (예 : 사용자 ID) 및 각 발생에 대한 날짜 범위를 기반으로 행을 가져 와서 hours_worked와 같은 특정 필드를 합계해야합니다. 해당 foreach 내의 다른 foreach가 날짜 범위 변수와 user_id를 다른 함수로 전달하는 쿼리를 실행한다는 측면에서 생각했습니다.

이제 행의 첫 번째 항목을 가져와 hours_worked 필드로 가져 와서 합계로 출력합니다. PHP는 어떻게 user_id를 기반으로 개별 사용자의 행을 순환하고, 출력 할 특정 필드를 합산합니까?

예를 들어 user_id 1은 4 행의 데이터를 가지며 각 행 배열의 값은 1,4,9,2 (행당 시간)입니다. user_id 2는 8 행의 데이터를 가지며 각 행 배열의 값은 4,2 , 4,4,1,1,4,8. 사용자 1에 대해 "1"을 표시하거나 사용자 2에 대해 "4"를 표시합니다. 총 16 시간까지 사용자 1의 행이 필요하고 시간 28의 사용자 2 행은 총 28 개가 필요합니다.

어떻게 가야합니까? 이 데이터를 얻으려면 이미 실행중인 foreach 루프 내에서?

아니면 완전히 잘못 될까요?

월별 보고서를 출력하기 위해 출력이 DataGrid로 포맷된다는 것을 잊지 않았습니다. 그러나 이것의 약 80 %가 지옥보다 나쁜 장소에서 유산 협약 코드입니다. 그래서 그들은 그것을 바꾸고 싶지 않기 때문에이 모든 것을 해결해야만합니다. 여기서 시나리오를 자세히 자세히 설명하는 것이 영원히 필요합니다.

어쨌든 여기에 내가하려는 일에 대한 일반적인 아이디어를 제공하는 일부 코드 스 니핏이 있습니다. 주목해야 할 주요 사항은 들어오는 데이터가 이미 입력 된 필드와 동일한 이름의 변수에 할당된다는 것입니다. $ user_id는 'user_id'이고 $ created_date는 'created_date'입니다.

두 가지 이슈, 외부 foreach가 적어도 한 번 실행될 때까지 실행되지 않는 것이므로 첫 번째 행은 일반적으로 합계 시간이 예상대로 작동하는 것으로부터 정상적으로 들어올 데이터를 놓친다. 그리고 2, 그것은 단지 각 사건의 첫 번째 행을로드하는 것처럼 보이므로 합계가 아닌 'hours_worked'의 첫 번째 값만 얻습니다.

$users = Users::getAllUsers(); 

foreach ($users as $user => $find_user) 
{  
    $user_data = $find_user['user_obj']; //this is so all users can be listed on the datagrid at all times rather than only show up if date range/user_id matches. I have the query function assigning variables to the array items. (ex. $name prints the name at this point if I call it in the html table) 

    $tech_data = Maintenance::getTechDataByDateRangeAndUser($month, $year, $techs->uid); //unlike the above that gets all, this one gets data by type "techs" in the query and then by specific user_id within a month year date range. 

//all I want to do at this point is tally the 'hworked' field (pre-assigned as $hworked in the query function) for all rows occurring for each tech. 
    foreach ($tech_data as $data => $find_tech_data) 
     { 
     $worked_hours_total = 0;  

     $tech_occurrence = $find_tech_data['hused']; 
     $tech_occurrence_hours = $tech_occurrence; 
     $worked_hours_total += doubleval($tech_occurrence_hours); 
     } 
     $tech_hours = $worked_hours_total;  

    } 
?> 
+0

SQL 쿼리를 약간 최적화 할 수 있습니다. DB 스키마에 대해 좀 더 많은 정보를 제공 할 수 있다면 누군가 LEFT JOIN 및 SUM() 정보를 사용하여 삶을 편하게하는 방법을 보여줄 수 있습니다. SQL 쿼리는 DB에서 원하는 방식으로 데이터를 가져올 수 있습니다. – gnarf

답변

1

나는 당신이 당신의 질문만으로이 문제를 해결할 수 있다고 생각합니다. 정확한 표/열 이름을 모르므로 찌르기를 할 것입니다.

SELECT u.* 
    , SUM(h.hours_worked) 
    FROM user u 
    LEFT JOIN hours h 
    ON u.user_id = h.user_id 
GROUP BY u.user_id 

당신은 더 나아가 당신의 날짜 범위 where 절을 추가 할 수 있습니다. 6 월 (예 :

)
SELECT u.* 
    , SUM(h.hours_worked) 
    FROM user u 
    LEFT JOIN hours h 
    ON u.user_id = h.user_id 
WHERE (DATE(h.date) >= '2009/06/01' AND DATE(h.date) < '2009/07/01') 
GROUP BY u.user_id 
+0

그래, 나는 그럴 필요가 없길 정말로 바랬다.나는 이미 이와 비슷한 질의를 가지고 있지만 ceartain 상태 유형 (첫 번째 foreach)을 가진 모든 사람들의 목록을 필요로하지만 데이터 범위 내에 있지 않더라도 여전히 나타나기 때문에 나는 다른 쿼리를 실행 한 다음 날짜 범위와 사용자 ID를 전달하여 나머지를 필터링하고 날짜 범위와 user_id와 일치하는 특정 필드의 합계 인 데이터로 사이트의 나머지 필드를 채 웁니다. 말이 돼? 이것의 일부는 일반적으로 혼란 스럽기 때문입니다. 귀하의 정보를 가져 주셔서 감사합니다. –

+0

다른 말로하면 foreach 1은 사람을 나열하는 데 더 많은 정적 데이터의 대부분을 얻습니다. 두 번째 foreach는 user_id와 날짜 범위 내에서 발생하는 관련 행을 가져온 다음 출력하기 위해 일부 필드를 합친 것으로 가정합니다. –

+0

하하, 아니, 정말 말이되지 않습니다. 원래의 질문으로 돌아가서 예제 코드 또는이 코드를 명확히하는 데 도움이되는 다른 것을 삽입해야합니다. 긴 질문을하는 것에 대해 걱정하지 마십시오. 단지 많은 정보를 제공하십시오. –

관련 문제