首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写mysql查询以返回比较同一表的行的结果?

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

Stack Overflow用户
提问于 2017-04-08 04:08:58
回答 1查看 80关注 0票数 0

我有一个表的结构,如下图所示。基本上,它有像u1、u2这样的用户in,他们将在给定的日期在给定的考试中心/地点进行E1、E2等考试,比如shift 1,shift 2等。一天最多有4班,轮班数不多。从1到4。

在这个表中,我需要找出同一用户在相同的日期和中心进行考试,但连续轮班的行。例如,U1在同一中心进行两次考试,即1和2连续轮班的图像中突出显示的红色行。用户在连续4次轮班的一天内进行最多4次考试。

我想写的另一个查询是,如果同一个用户在同一日期进行两次或两次以上的考试,但在不同的中心进行考试,那么在哪里。用蓝色高亮显示的行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-08 04:37:42

请试试..。

代码语言:javascript
复制
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;

我解释你的问题的方式--你要求的是usersame center on the same date中有2 or more exams的记录。这向我表明,User是最主要的因素,在Exam Date中,在Centerscount of Exams中。因此,GROUP BYCOUNT()行从我的内部SELECT语句。

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

INNER JOIN在这里的作用是将在该Date上的User上发生的考试计数加到相应的行上。

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

当我为您的第二个查询构造以下代码时,使用了该逻辑的一个变体.

代码语言:javascript
复制
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语句使用这些数据来形成一个列表,列出每个User在每个DATE上为一个Exam参加了多少个Exam

最外层的SELECT使用此计数只返回符合指定条件的tblExams中的行。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43290070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档