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

标签 mysql

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

鉴于此表,我需要找出同一用户在同一日期和中心但连续轮类进行考试的行。例如,图像中突出显示的红色行,其中 U1 在同一中心但连续轮类进行两次检查,即 1 和 2。用户可能会在 4 个连续轮类中一天内最多进行 4 次检查。

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

enter image description here

最佳答案

请尝试...

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;

我解释您问题的方式是,您要求记录用户同一中心进行2次或更多考试同一日期。这向我表明,用户是最主要的因素,其中考试日期中心 考试 的>计数。因此,我的内部 SELECT 语句中的 GROUP BYCOUNT() 行。

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

INNER JOIN 在这里的作用是附加在该 日期考试中心 进行的考试的计数User 到相应的行上。

然后我们需要做的就是从 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 语句来获取每个用户在不同日期参加的考试中心列表>.

然后,最中间的 SELECT 语句会使用此数据来形成每个用户参加一次事件的中心数量的列表。他们在每个日期进行考试

最外层的 SELECT 使用此计数来仅返回 tblExams 中满足指定条件的行。

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

关于mysql - 如何编写mysql查询来返回比较同一个表的行的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43290070/

相关文章:

Mysql 大型 SQL 查询,截取 2,000 个字符

mysql - 如果不满足条件,则从其他表获取值

mysql - 选择日期范围内的补充记录

php - 如何在 PHP 中解码 json 字符串并添加到数组

mysql - Mysql中SELECT COUNT()的解释

mysql - 如何使用 group by order by 连接两个表

MySQL:将相关的 BOOL 首选项全部存储在一个整数中作为其二进制值的每一位

php - 从 PHP 调用存储过程与 SQL 查询之间的区别

mysql - curdate() 的时间?

MySQL - 不同表中的多次插入