2017-04-08 69 views
0

我有一个表结构,如下图所示。基本上,它有用户标识u1,u2,他们将在给定的考试中心/场地按指定的班次,如班次1,班次2等,在给定日期给出E1,E2等考试。一天中最多有4班与转变nos。从1到4.如何编写一个mysql查询来返回比较同一表的行的结果?

鉴于此表,我需要找出同一用户在同一日期和中心进行考试的行,但是需要连续轮班。例如U1在同一中心给予两次考试,但是在连续的班次中,即1和2,可能发生的情况是,用户在一天内连续4次轮班中最多4次考试。

我试图写的另一个问题是,如果同一用户在同一日期但在不同的中心给予两个或更多的考试。以蓝色突出显示的行。

enter image description here

+0

您是否需要检查计划冲突,即同时安排两次考试? – toonice

+0

是的,基本上想法是我们需要检查用户是否在一天内进行多项考试,我们想给他同一个中心,以便他不必在中心之间跑步。再次,如果用户在同一天并且在同一中心进行多项考试,如果可能的话,我们需要让他在两次轮班之间休息,即如果他在轮班1和轮班2中进行考试,我们想要重新分配到轮班3或转移4.所以我们需要这个报告 – ashishjmeshram

+0

我是否正确地假设'Sr.No'(我建议改为'srNum')是主键? – toonice

回答

1

请尝试...

SELECT tblExams.srNum AS srNum, 
     tblExams.user_id AS user_id, 
     tblExams.exam_id AS exam_id, 
     tblExams.exam_date AS exam_date, 
     tblExams.exam_center_id AS exam_center_id, 
     tblExams.exam_shift as exam_shift 
FROM tblExams 
JOIN 
{ 
    SELECT user_id AS user_id, 
      exam_date AS exam_date, 
      exam_center_id AS exam_center_id, 
      COUNT(exam_center_id) AS exam_center_id_count 
    FROM tblExams 
    GROUP BY user_id, 
      exam_date, 
      exam_center_id 
} exam_center_counter ON tblExams.user_id = exam_center_counter.user_id 
        AND tblExams.exam_date = exam_center_counter.exam_date 
        AND tblExams.exam_center_id = exam_center_counter.exam_center_id 
WHERE exam_center_counter.exam_center_id_count >= 2; 

我已经解释了你的问题,你所要求的记录中,其中user已在same centerthe same date2 or more exams的方式。这向我建议User是最主要的因素,并且在Exam Date之内,并且在CentersExamscount之内。因此GROUP BYCOUNT()行来自我的内部SELECT声明。

其他三个选择的领域是有部分原因是GROUP BY使用它们,因此要求他们成为SELECT的一部分,部分原因在于他们需要形成,我认为你的表INNER JOINtblExams(名字数据)。 (注意:如果单词JOIN没有加入类型,则执行INNER JOIN)。

INNER JOIN有此套结对考试发生在Exam CenterDateUser到相应的行(S)的数量的效果。

然后,我们所需要做的就是从tblExams的每一行中选择所有字段,其中该计数至少为2

当我构建了下面的代码为你的第二个查询这个逻辑的变化为使用...

SELECT tblExams.srNum AS srNum, 
     tblExams.user_id AS user_id, 
     tblExams.exam_id AS exam_id, 
     tblExams.exam_date AS exam_date, 
     tblExams.exam_center_id AS exam_center_id, 
     tblExams.exam_shift as exam_shift 
FROM tblExams 
JOIN 
{ 
    SELECT user_id AS user_id, 
      exam_date AS exam_date, 
      COUNT(exam_center_id) AS exam_center_count 
    FROM 
    { 
     SELECT user_id AS user_id, 
       exam_date AS exam_date, 
       exam_center_id AS exam_center_id 
     FROM tblExams 
     GROUP BY user_id, 
       exam_date, 
       exam_center_id 
    } exam_center_id_grouper 
    GROUP BY user_id, 
      exam_date 
} exam_center_counter ON tblExams.user_id = exam_center_counter.user_id 
        AND tblExams.exam_date = exam_center_counter.exam_date 
WHERE exam_center_counter.exam_center_count >= 2; 

在此查询我用的是最里面的SELECT语句来获取是Exam Centers列表每个User出席各种Dates

该数据随后被中间最SELECT声明形成多少Centers每个User出席的每个DATEExam他们这样做的列表。

此计数由最外层的SELECT使用,以仅返回符合指定条件的tblExams中的那些行。

如果您有任何问题或意见,请随时发布相应评论。

+1

我发布了一个包含第一个查询的答案。第二个查询将很快跟进...... – toonice

+0

谢谢,第一个查询按预期工作。 – ashishjmeshram

+1

我已经添加了第二个查询,现在正在处理解释。 – toonice

相关问题