php和mysql用户跟踪和报告

问题描述:

我目前有一个表,它由用户信息和课程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

目前您的员工只能参加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

您需要规范化数据库设计。

考虑员工和课表之间的链接表。这使您可以将许多员工与许多课程联系起来。

例如为:

职员表

employee_id, num_visits 

课程表

lesson_id, category, title, filepath, numberviews 

employee_lesson表

employee_id, lesson_id 

的EMPLOYEE_ID和lesson_id创建复合键。

添加到答案这里是我的两分钱:

考虑到我如下的添加表结构,你需要以下的查询来提取需要的数据:

如果你正在追查通过访问表员工使用以下,结果是前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