我是php / mysql编程的新手,我很难搞清楚我正在尝试构建的关系数据库的逻辑。这是问题所在:
我有不同的领导,他们将在上午9点到晚上9点之间随时负责商店。
访问过商店的顾客可以按1至5的等级评定他们的体验。
我正在建立一个网站,允许我存储领导者工作的班次,如下所示。
当我点击提交时,该网站将采用数据leaderName:“George”,shiftTimeArray:上午11点,下午1点,下午6点(来自图片中的示例)和shiftDate并将它们发送到SQL数据库。
后来,我希望能够通过向mysql发送查询来获取一个人的平均分数,检索该领导者收到的所有分数并将它们平均在一起。我知道构建表单和执行搜索的代码。但是,我很难想出与数据相关的表的逻辑。目前,我有一个名为response的mysql表,其中包含以下字段,
leader_id
shift_date // contains the date that the leader worked
shift_time // contains the time that the leader worked
visit_date // contains the date that the survey/score was given
visit_time // contains the time that the survey/score was given
score // contains the actual score of the survey (1-5)
我输入领导者在一周开始时的工作班次,然后在一周内输入调查分数。
所以这是问题:我应该创建哪些mysql表和字段来关联这些数据,以便我可以查询领导者的名字并从他们的所有调查中获得平均分数?
答案 0 :(得分:2)
您需要以下表格:
Leader (leader_id, name, etc)
Shift (leader_id, shift_date, shift_time)
SurveyResult (visit_date, visit_time, score)
注意:省略了我可能包含的Shift和SurveyResult的代理主键。
要查询你加入轮班和调查小组的领导者并取平均值然后jon回到领导者的名字。
查询可能类似(但我没有;实际上是在MySQL中构建它来验证语法)
SELECT name
,AverageScore
FROM Leader a
INNER JOIN (
SELECT leader_id
, AVG(score) AverageScore
FROM Shift
INNER JOIN
SurveyResult ON shift_date = visit_date
AND shift_time = visit_time --depends on how you are recording time what this really needs to be
GROUP BY leader ID
) b ON a.leader_id = b.leader_id
答案 1 :(得分:1)
我会做以下结构:
<强>领袖强>
leaders_timetabke (每位领导可以多次)
<强> survey_scores 强>
SELECT l.id, l.name, AVG(s.score) FROM leaders l INNER JOIN leaders_timetable lt ON lt.leader_id = l.id INNER JOIN survey_scores s ON lt.shift_datetime=DATE_FORMAT('Y-m-d H:00:00', s.visit_datetime) GROUP BY l.id
此处的DATE_FORMAT有助于减少来自visit_datetime的小时和分钟,以便可以与shift_datetime进行匹配。这是MYSQL函数,所以如果你使用别的东西,你需要使用不同的函数
答案 2 :(得分:0)
假设你有一个领导者&#39;谁有5个调查行,分数为1,2,3,4和5。
如果您选择该领导者的所有调查,请将调查分数相加并除以5(该领导者的调查总数)。您将获得平均值,在这种情况下为3。
(1 + 2 + 3 + 4 + 5)/ 5 = 3
您不需要再创建表格或字段,就可以得到所需的内容。