关系数据库逻辑

时间:2014-04-23 13:27:57

标签: mysql

我是php / mysql编程的新手,我很难搞清楚我正在尝试构建的关系数据库的逻辑。这是问题所在:

  1. 我有不同的领导,他们将在上午9点到晚上9点之间随时负责商店。

  2. 访问过商店的顾客可以按1至5的等级评定他们的体验。

  3. 我正在建立一个网站,允许我存储领导者工作的班次,如下所示。

    screen shot of site

    当我点击提交时,该网站将采用数据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表和字段来关联这些数据,以便我可以查询领导者的名字并从他们的所有调查中获得平均分数?

3 个答案:

答案 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)

我会做以下结构:

<强>领袖

  • ID
  • 名称

leaders_timetabke (每位领导可以多次)

  • ID
  • leader_id
  • shift_datetime(我假设它在这里存储日期和小时,分钟和秒总是0

<强> survey_scores

  • ID
  • visit_datetime
  • 得分
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

您不需要再创建表格或字段,就可以得到所需的内容。