MYSQL从同一张表中选择不同的记录

Posted

技术标签:

【中文标题】MYSQL从同一张表中选择不同的记录【英文标题】:MYSQL Select different records from same table 【发布时间】:2021-12-08 05:10:36 【问题描述】:

我正在研究小型学校数据库,我需要一些帮助来选择仅在第 1 周和第 2 周的不同日期预订的学生。

我的表结构如下:

ChildId    Day  Room  Week
=======    ===  ====  ====
  1        1     20    1
  1        2     20    1
  2        1     20    2
  3        1     20    1
  3        2     20    1
  3        1     20    2
=====     ===   ===   ===

我想让所有满足以下条件的孩子:

仅在第二周预订(这是 ChildId 2,我可以从以下查询中获得)
  SELECT DISTINCT b.childid FROM booking b
        where b.childid NOT IN (SELECT childid FROM bookingtemplate WHERE weekno = 1)

我也需要

第二周的所有孩子,他们的日子与第一周不同。这将是 ChildID 3,因为他在第 1 周的周一和周二以及第 2 周的周一预订。

我无法找到两个星期的日子不同的孩子:

谢谢

【问题讨论】:

列房间是否与您的要求相关? @forpas 没有房间可以忽略。 【参考方案1】:

您可以通过聚合和HAVING 子句中的条件来做到这一点:

SELECT ChildId 
FROM booking
WHERE Week IN (1, 2)
GROUP BY ChildId
HAVING MIN(Week) = 2
    OR GROUP_CONCAT(DISTINCT CASE WHEN Week = 1 THEN Day END ORDER BY Day) <>
       GROUP_CONCAT(DISTINCT CASE WHEN Week = 2 THEN Day END ORDER BY Day);

请参阅demo。

【讨论】:

可能 GROUP_CONCAT 需要 DISTINCT,如果样本集中第 4 行 day = 1,则应排除 child3。 @ProGu 我假设同一个 ChildId 不会在同一天预订两次。 @forpas 我应该提到孩子可以在同一天预订两个房间(上午和下午) @snowflakes74 我已经在您的问题下的评论中提出了这个问题,您回答:没有房间可以忽略 @snowflakes74 然后在 GROUP_CONCAT() 中添加 DISTINCT。请参阅我编辑的答案。【参考方案2】:

您可以自行加入表格并过滤日期不同的情况。

SELECT DISTINCT
  b1.ChildId
FROM
  booking b1
INNER JOIN
  booking b2
ON
  b1.ChildId = v2.ChildId
  AND b1.Week = 1 AND b2.Week = 2
  AND b1.Day <> b2.Day

【讨论】:

这不会返回 ChildId = 2 ChildID 2 不在这两个星期。这仅适用于问题的后半部分,因为 OP 似乎已经解决了第一部分(第 2 周的孩子)。 我假设 OP 在单个查询中需要两个条件的结果。

以上是关于MYSQL从同一张表中选择不同的记录的主要内容,如果未能解决你的问题,请参考以下文章

从同一张表中最小的 4 个 ID 中选择一个随机 ID

如何用通配符比较同一张表中的两条记录?

MySQL触发器:更新一张表中的记录,其中同一行中的记录匹配选择查询

mysql左连接右连接(查询两张表不同的数据)

如何从一个表中选择另一张表中不存在的所有记录?

如何从一个表中选择另一张表中不存在的所有记录?