在一个范围内找到丢失的数据


PHP - Find Missing Data In A Range

我是PHP新手,在查询中遇到困难,我认为应该相当容易。我有一个表是名字列表(Names),另一个表是这些名字加上他们参加课程的周数(Weeks),为期4周。我只需要找出他们不在场的周数。例如:

Names:

Name
-----
Jon
Frank

Weeks:

Name   Week
-----  ----
Jon    1 
Jon    2
Jon    4
Frank  1
Frank  3
Frank  4

我试图写一个查询,告诉我约翰错过了第3周,弗兰克错过了第2周。我不知所措,因为我似乎做不下去了。提前感谢您提供的任何帮助!

您可以创建一个包含所有出席人数的表(交叉连接),然后取差值:

SELECT n.`name`, wn.`week`
FROM `names` n, `week_numbers` wn
MINUS
SELECT `name`, `week` FROM `weeks`

由于mysql不直接支持minus,你必须通过使用JOIN/NOT IN/NOT EXISTS来绕过它:

SELECT n.`name`, wn.`week`
FROM `names` n, `week_numbers` wn
LEFT JOIN `weeks` w
ON w.`name` = n.`name` AND wn.`week` = w.`week`
WHERE w.`name` IS NULL

我相信一定有更好的解决方案。

创建包含给定课程的所有周数的表:

create table Allweeks (Week int(11) NOT NULL);
insert into Allweeks values (1), (2), (3), (4); 

使用这个查询获取所有用户错过的周:

SELECT Names.Name, Allweeks.Week from Names CROSS JOIN Allweeks 
LEFT JOIN Weeks on (Allweeks.Week = Weeks.Week and Names.Name = Weeks.Name) 
WHERE Weeks.Name IS NULL ORDER BY Names.Name;

这是快速和肮脏的,但应该工作。我建议在设计数据库时研究数据库规范化、使用主键和索引等主题。