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列。 但是,我很遗憾下一步去哪里查询结果。
目前您的员工只能参加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;
1,2,3,4。我声明一个命名战争的专栏! +1。希望他会参观你的正常化课程。 – webbiedave 2010-04-27 15:00:14
对不起,我应该说每次添加课程时都会在用户表中创建一个新列,并在课程表中创建一个新行。因此,如果我查看表格并手动查看他们所做的事情,那么所有跟踪都可以正常工作。然而,将其自动化成报告是我陷入困境的地方。即获得大于0的所有lessonID,然后将它们与课程表交叉引用以检索标题。 但是,感谢有关重组的信息,我可能需要它,如果我不能在php/mysql中找到方法:) – inertiahz 2010-04-27 15:06:52
@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)
没有足够的时间来测试查询,但我认为他们至少应该点你在正确的方向,希望它有助于一点:)
谢谢你对此的意见,但我可以澄清一些事情吗?因为我想追踪用户观看课程的次数,我应该每次点击链接时都向类表添加新行?因此,举例来说,如果我们有1000名员工,并且他们都点击课程,那么班级表格将有1000行,这是存储数据的正确方法吗? 谢谢:) – inertiahz 2010-04-27 20:48:42
不完全是,你需要添加一个新的字段到**类**表,名为“views”,这个字段将增加1,每次用户查看该课程。你看,**班**表是由**课**和**员工**表之间的关系而产生的,每个员工可以查看1个或更多课程,每个课程可以有1个或更多员工,现在, employeeId和lessonId都是唯一标识符,不会有另一行具有相同的这些ID组合。是的,对于employeeId和lessonId的每个组合,类表中将有1行。希望我解释自己:) – Ozmah 2010-04-29 22:07:48
当你有一个名为Foo1和Foo2,Foo3列是可能有时间重新考虑你的设计。规范化! – 2010-04-27 14:53:02
哪一部分你有特别的麻烦? SQL? PHP代码?向我们展示你到目前为止所尝试过的。 – webbiedave 2010-04-27 14:55:36
我在原始问题中添加了代码更新。 – inertiahz 2010-04-27 15:21:11