【问题标题】:MYSQL Select different records from same tableMYSQL从同一张表中选择不同的记录
【发布时间】: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 没有房间可以忽略。

标签: mysql sql group-by group-concat having


【解决方案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 在单个查询中需要两个条件的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
相关资源
最近更新 更多