2010-04-27 91 views
0

我目前有一個表,它由用戶信息和課程ID組成;該表的佈局看起來像:php和mysql用戶跟蹤和報告

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

,其中含有約教訓的信息的教訓表:

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

內的用戶表中的lessonID領域是追蹤某人多少次有一個整數點擊了一課。現在我想要做的是在報告中,我有前5位訪問過該網站的人,並希望能夠深入瞭解他們點擊了哪些課程。 任何人都可以幫忙嗎?或者重構數據庫的方式是一件容易的事情?

感謝


我一直在尋找它到目前爲止的方式是:
1 - 讓所有的lessonID列特定僱員
2 - 檢查哪些有一個值大於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構造查詢,選擇與特定僱員在用戶表中的所有lessonID列。 但是,我很遺憾下一步去哪裏查詢結果。

+1

當你有一個名爲Foo1和Foo2,Foo3列是可能有時間重新考慮你的設計。規範化! – 2010-04-27 14:53:02

+0

哪一部分你有特別的麻煩? SQL? PHP代碼?向我們展示你到目前爲止所嘗試過的。 – webbiedave 2010-04-27 14:55:36

+0

我在原始問題中添加了代碼更新。 – inertiahz 2010-04-27 15:21:11

回答

2

目前您的員工只能參加3節課。你會更好地規範化數據。也許是這樣的:

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:

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

1,2,3,4。我聲明一個命名戰爭的專欄! +1。希望他會參觀你的正常化課程。 – webbiedave 2010-04-27 15:00:14

+0

對不起,我應該說每次添加課程時都會在用戶表中創建一個新列,並在課程表中創建一個新行。因此,如果我查看錶格並手動查看他們所做的事情,那麼所有跟蹤都可以正常工作。然而,將其自動化成報告是我陷入困境的地方。即獲得大於0的所有lessonID,然後將它們與課程表交叉引用以檢索標題。 但是,感謝有關重組的信息,我可能需要它,如果我不能在php/mysql中找到方法:) – inertiahz 2010-04-27 15:06:52

+0

@inertiahz:你的應用程序不應該改變那樣的數據庫結構。我強烈建議你遵循dnagirl的規範化建議,尤其是員工/課程交叉參考表。然後,你將會變得不自在。 – webbiedave 2010-04-27 15:17:40

0

您需要規範化數據庫設計。

考慮員工和課表之間的鏈接表。這使您可以將許多員工與許多課程聯繫起來。

例如爲:

職員表

employee_id, num_visits 

課程表

lesson_id, category, title, filepath, numberviews 

employee_lesson表

employee_id, lesson_id 

的EMPLOYEE_ID和lesson_id創建複合鍵。

0

添加到答案這裏是我的兩分錢:

考慮到我如下的添加表結構,你需要以下的查詢來提取需要的數據:

如果你正在追查通過訪問表員工使用以下,結果是前5名的員工誰訪問了網站:如果您使用的訪問表

SELECT * FROM employee ORDER BY visits ASC 0,5 

SELECT employee.*, count(visit.visitId) as visits FROM employee, visit WHERE employee.employeeId = visit.employeeId GROUP BY employee.employeeId ASC 0,5 

finallly,檢查每個員工訪問了什麼教訓,只要使用此:

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

你應該重新考慮設計,我個人會做這樣的事情:

**employee** 
employeeId 
employeeName 
employeeLName 
visits 
lastVisit 

如果您想要追蹤每次訪問的日期和時間,您應該添加一個新表格,訪問,如果您對日期和時間不感興趣,或者只是最後一個,只需將字段添加到員工表中:

**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) 

沒有足夠的時間來測試查詢,但我認爲他們至少應該點你在正確的方向,希望它有助於一點:)

+0

謝謝你對此的意見,但我可以澄清一些事情嗎?因爲我想追蹤用戶觀看課程的次數,我應該每次點擊鏈接時都向類表添加新行?因此,舉例來說,如果我們有1000名員工,並且他們都點擊課程,那麼班級表格將有1000行,這是存儲數據的正確方法嗎? 謝謝:) – inertiahz 2010-04-27 20:48:42

+0

不完全是,你需要添加一個新的字段到**類**表,名爲「views」,這個字段將增加1,每次用戶查看該課程。你看,**班**表是由**課**和**員工**表之間的關係而產生的,每個員工可以查看1個或更多課程,每個課程可以有1個或更多員工,現在, employeeId和lessonId都是唯一標識符,不會有另一行具有相同的這些ID組合。是的,對於employeeId和lessonId的每個組合,類表中將有1行。希望我解釋自己:) – Ozmah 2010-04-29 22:07:48