2010-04-27 3 views
0

현재 사용자 정보와 수업 ID로 구성된 테이블이 있습니다. 사람이 얼마나 많은 시간을 추적하는 정수 사용자 테이블의 lessonID 필드 내에서PHP 및 MySQL 사용자 추적 및보고

------------------------------------------------------ 
|lessonID |cateogry |title |filepath |numberviews| 
------------------------------------------------------ 
|1   |beginner |lesson |file:// |10   | 

:

---------------------------------------------------- 
|employeeID|numVisits|lessonID1|lessonID2|lessonID3| 
---------------------------------------------------- 
|33388  |2  |1  |0  |3  | 

및 수업에 대한 정보를 포함하는 교훈 테이블 : 같은 테이블 레이아웃이 보인다 수업을 클릭했습니다. 지금 내가하려고하는 것은 사이트를 방문한 사용자 중 상위 5 명이 클릭 한 레슨을 드릴 다운 할 수있는 보고서에 있습니다. 누구든지 도움이 될 수 있습니까? 아니면 데이터베이스가 더 쉬운 작업이 될 수 있도록 구조 조정을 할 것인가?

감사


내가 지금까지보고 된 방법은 다음과 같습니다
1 - 특정 직원 ID에 대한
(2) 모든 lessonID 열을 얻을 - 값을 가지고있는 것을 확인 0보다 큰
3 단계 2에서 목록을 사용하여 사용자 테이블의 lessonID에 해당 제목을 쿼리합니다.
1 단계 :

$sql = mysql_query("SELECT * FROM users 
      WHERE employeeID = 15110") or die(mysql_error()); 

$columns = mysql_num_fields($sql); 
for($i = 0; $i < $columns; $i++) { 
    if(substr(mysql_field_name($sql, $i),0, 8) == "lessonID"){ 
     $lessons[] = mysql_field_name($sql,$i).", "; 
    } 
}; 
$lessonID = array_unique($lessons); 

$l = substr("SELECT ".implode($lessonID)."", 0, -2)." FROM users WHERE employeeID = 15110"; 

이것은 내가 손해를보고 지금있는 경우, 위의 $ (L)가 특정 직원 ID와 사용자 테이블의 모든 lessonID 열을 선택하는 쿼리를 구성합니다. 그러나 쿼리 결과와 함께 다음으로 어디로 가야할지를 놓치고 있습니다.

+1

입니다 도움이되기를 바랍니다, 나는 그들이 올바른 방향으로 이상 지점을해야한다고 생각하지만, 쿼리를 테스트 할 시간이 충분하지 않았나요 아마 당신의 디자인을 재고 할 시간. 정상화! –

+0

구체적으로 어떤 부분에 문제가 있습니까? SQL? PHP 코드? 지금까지 시도한 것을 보여주십시오. – webbiedave

+0

원래 질문에 코드가있는 업데이트를 추가했습니다. – inertiahz

답변

2

현재 직원은 3 회의 수업 만 수강 할 수 있습니다. 데이터를 표준화하는 것이 좋습니다. 이 같은 아마 뭔가 :

SELECT count(*) FROM emp_lessons WHERE lesson_id=1 AND emp_id=x; 
:

employees 
--------- 
emp_id 
emp_name 
etc. 

visits 
------ 
visit_id 
visit_timestamp 
emp_id 

lessons 
------- 
lesson_id 
lesson_title 
etc. 

emp_lessons 
----------- 
emp_id //FK to employees table 
lesson_id //FK to lessons table 
lesson_date 
누군가가 방문 빈도를 알고 싶은 그런

,

SELECT count(*) FROM visits WHERE emp_id=x 

그리고 당신은 누군가가 레슨 1을했다 얼마나 많은 시간을 알고 싶다면

+0

1, 2, 3, 4. 열 명명 전쟁을 선언합니다! +1. 잘만하면 정규화 수업을 방문하게되기를 바랍니다. – webbiedave

+0

죄송합니다. 제가 수업을 추가 할 때마다 사용자 테이블에 새 열이 만들어지고 수업 테이블에 새 행이 만들어집니다. 테이블을보고 수동으로 수행 한 작업을 수동으로 확인하면 모든 추적 작업이 올바르게 작동합니다. 그러나 이것을 보고서로 자동화하는 것이 내가 갇혀있는 곳입니다. 나는. 0보다 큰 모든 lessonID를 가져온 다음 레슨 테이블과 상호 참조하여 제목을 검색하십시오. 구조 조정에 대한 정보를 주셔서 감사합니다, 나는 PHP/mysql에서 그것을 할 방법을 그림을 기울이지 않으면 필요할 수 있습니다 :) – inertiahz

+0

@inertiahz : 귀하의 응용 프로그램은 DB 구조를 변경해서는 안됩니다. dnagirl의 정규화 제안, 특히 직원/레슨 상호 참조 테이블을 따르는 것이 좋습니다. 너는 그때 너의 길에서 벗어나게 될 것이다. – webbiedave

0

데이터베이스 디자인을 표준화해야합니다.

직원과 강의 테이블 간의 연결 테이블을 고려하십시오. 이를 통해 많은 직원들을 많은 수업에 연관시킬 수 있습니다.

예컨대 :

직원 테이블

employee_id, num_visits 

학습 테이블

lesson_id, category, title, filepath, numberviews 

employee_lesson 테이블

employee_id, lesson_id 

employee_id입니다 및 합성을 만들 lesson_id 열쇠.

0

답변에 추가 여기에 내 두 센트 : 당신은을 통해 방문을 추적하는 경우

: 나는 아래 추가 된 테이블 구조를 고려

, 당신은 당신이 필요로하는 데이터를 추출하기 위해 다음과 같은 쿼리를 필요

: 당신이 방문 테이블을 사용하는 경우

SELECT * FROM employee ORDER BY visits ASC 0,5 

: 다음을 사용하여 테이블 직원, 결과는 사이트를 방문한 상위 5 명의 직원입니다 각 직원이 액세스 한 어떤 교훈을 확인하는 finallly

, 그냥 사용 : 경우

**employee** 
employeeId 
employeeName 
employeeLName 
visits 
lastVisit 

:

SELECT * FROM employee WHERE employeeId = (SELECT employeeId FROM class GROUP BY lessonId) 

당신은 개인적으로 나는 이런 식으로 뭔가를 할 거라고, 디자인을 재고해야 각 방문의 날짜와 시간을 추적하여 날짜, 시간 또는 마지막 테이블에만 관심이있는 경우 새 테이블을 추가하거나 방문해야합니다.

**visit** 
visitId 
visitDate 
employeeId FK 

**lesson** 
lessonId 
lessonName 
lessonPath 
lessonViews 

**class** (or any name you see fit) 
employeeId FK 
lessonId FK 
lessonDate (Last time the employee accessed the lesson) 

당신이 FOO1, FOO2, Foo3라는 컬럼이 때 조금 :)

+0

이것에 대한 귀하의 의견을 주셔서 감사합니다,하지만 난 그냥 뭔가를 명확히 할 수 있습니까? 사용자가 링크를 클릭 할 때마다 클래스 테이블에 새 행을 추가해야하는 횟수를 추적하고 싶습니다. 예를 들어 1000 명의 직원이 있고 수업 테이블에 1000 개의 행이있는 수업을 모두 클릭하면 데이터를 저장하는 올바른 방법입니까? 감사합니다 :) – inertiahz

+0

정확하게, 당신은 ** fields ** 테이블 ** 필드에 새로운 필드를 추가해야합니다.이 필드는 사용자가 그 레슨을 볼 때마다 1 씩 증가합니다. ** 수업 ** 표는 ** 강의 ** 및 ** 직원 ** 표 사이의 관계에서 태어 났으며 각 직원은 1 개 이상의 강의를 볼 수 있으며 각 강의에는 1 명 이상의 직원이 참여할 수 있습니다. employeeId와 lessonId는 모두 고유 한 식별자이며 해당 ID의 동일한 조합을 가진 다른 행은 없습니다. 그리고 그렇습니다. employeeId와 lessonId의 각 조합에 대해 클래스 테이블에 1 행이 있습니다. 희망은 나 자신을 설명했다 :) – Ozmah