繁体   English   中英

如何编写mysql查询以返回比较同一表的行的结果?

[英]How to write a mysql query to return result comparing rows of same table?

我有一个表格结构,如下图所示。 基本上,它有用户ID lke u1,u2,他们将在给定日期在给定的考试中心/地点以给定的班次(如班次1,班次2等)进行考试,例如E1,E2等。每天最多有4个班次轮班编号 从1到4

给定该表,我需要找出同一用户在同一日期和中心但连续轮班进行考试的行。 例如,红色行在图像中高亮显示,其中U1在同一中心进行两次考试,但以连续班次(即1和2)进行。有可能用户连续4天在一天之内进行最多4次考试。

我要写的另一个查询是,如果同一用户在同一日期但在不同中心进行两次或多次考试。 行以蓝色突出显示。

在此处输入图片说明

请试试...

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 the same datesame center进行2 or more exams记录。 在我看来, User是最主要的因素,在该Exam Date之内,在各CentersExams count之内。 因此,我内部的SELECT语句中的GROUP BYCOUNT()行。

之所以存在其他三个选定字段,部分是因为GROUP BY使用了它们,因此要求它们成为SELECT一部分,一部分是因为需要它们与tblExams一起形成INNER JOIN (我为您的数据表假定的名称) 。 (注意:如果单词JOIN前面没有JOIN类型,则执行INNER JOIN )。

INNER JOIN的作用是将该User在该Date在该Exam Center进行的考试数量附加到相应行上。

然后,我们要做的就是从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语句获取每个User在各个Dates参加的Exam Centers列表。

然后,最中间的SELECT语句将使用此数据来形成一个列表,该列表列出了每个User在每个DATE参加Exam Centers

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM