Mysql 关系数据库逻辑

Mysql 关系数据库逻辑,mysql,Mysql,我对php/mysql编程相当陌生,我很难弄清楚我试图构建的关系数据库的逻辑。问题是: 我有不同的领导,他们将在上午9点到晚上9点之间随时负责一家商店 访问过该商店的客户可以对其体验进行1到5分的评分 我正在建立一个网站,允许我存储一位领导的班次,如下所示 当我点击submit时,该站点会将数据引导名“George”、shiftTimeArray:11am、1pm、6pm(来自图片中的示例)和shiftDate发送到SQL数据库 稍后,我希望能够通过向mysql发送一个查询,检索该领导者收到的

我对php/mysql编程相当陌生,我很难弄清楚我试图构建的关系数据库的逻辑。问题是:

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

  • 访问过该商店的客户可以对其体验进行1到5分的评分

  • 我正在建立一个网站,允许我存储一位领导的班次,如下所示

    当我点击submit时,该站点会将数据引导名“George”、shiftTimeArray:11am、1pm、6pm(来自图片中的示例)和shiftDate发送到SQL数据库

    稍后,我希望能够通过向mysql发送一个查询,检索该领导者收到的所有分数并将其平均起来,从而获得一个人的平均分数。我知道构建表单和执行搜索的代码。然而,我很难想出与数据相关的表的逻辑。目前,我有一个名为responses的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表和字段来关联这些数据,以便查询领导者的姓名并从他们的所有调查中获得平均分数?

    您想要这样的表:

    Leader (leader_id, name, etc)  
    Shift (leader_id, shift_date, shift_time)
    SurveyResult (visit_date, visit_time, score)
    
    注意:省略了我可能包括的Shift和SurveyResult的代理主键

    若要查询,请加入“班次和调查”组,然后将平均值返回给“领导”,以获取名称

    查询可能类似于(但我还没有在MySQL中构建它来验证语法)


    假设你有一个“领导者”,他有5个调查行,得分分别为1、2、3、4和5

    如果选择此领导的所有调查,则将调查分数相加并除以5(此领导的调查总数)。在本例中,您将获得平均值3

    (1+2+3+4+5)/5=3


    您不需要再创建任何表或字段,您已经拥有了所需的内容。

    我将执行以下结构:

    领导者

    • 身份证
    • 名字
    领导者\u timetabke(每个领导者可以有多个)

    • 身份证
    • 领导id
    • shift_datetime(我假设它在这里存储日期和小时,分和秒总是0
    调查得分

    • 身份证
    • 访问时间
    • 得分

    这里的日期格式有助于缩短访问日期时间的小时和分钟,以便与shift\u datetime匹配。这是MYSQL函数,所以如果您使用其他函数,您需要使用不同的函数,而不是我的函数+1@Milanzor.不一定更好,只是更典型的关系型。我的可能对OPs-ne来说太过分了eds.单表解决方案必须为每个调查复制leader和shift信息,因此在插入新调查时,它必须以某种方式查找该信息,这将成为问题。
    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
    
    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