请尝试...
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 center
上the same date
2 or more exams
的方式。这向我建议User
是最主要的因素,并且在Exam Date
之内,并且在Centers
和Exams
的count
之内。因此GROUP BY
和COUNT()
行来自我的内部SELECT
声明。
其他三个选择的领域是有部分原因是GROUP BY
使用它们,因此要求他们成为SELECT
的一部分,部分原因在于他们需要形成,我认为你的表INNER JOIN
与tblExams
(名字数据)。 (注意:如果单词JOIN
没有加入类型,则执行INNER JOIN
)。
的INNER JOIN
有此套结对考试发生在Exam Center
上Date
为User
到相应的行(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
出席的每个DATE
的Exam
他们这样做的列表。
此计数由最外层的SELECT
使用,以仅返回符合指定条件的tblExams
中的那些行。
如果您有任何问题或意见,请随时发布相应评论。
您是否需要检查计划冲突,即同时安排两次考试? – toonice
是的,基本上想法是我们需要检查用户是否在一天内进行多项考试,我们想给他同一个中心,以便他不必在中心之间跑步。再次,如果用户在同一天并且在同一中心进行多项考试,如果可能的话,我们需要让他在两次轮班之间休息,即如果他在轮班1和轮班2中进行考试,我们想要重新分配到轮班3或转移4.所以我们需要这个报告 – ashishjmeshram
我是否正确地假设'Sr.No'(我建议改为'srNum')是主键? – toonice