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从同一张表中选择不同的记录的主要内容,如果未能解决你的问题,请参考以下文章