PHP - 查找范围中的缺失数据

时间:2011-07-29 03:26:38

标签: php mysql

我是PHP新手,对查询有困难我认为应该相当容易。我有一个表格,其中包含一个名单(Names),另一个表格中有这些名字以及他们参加课程(Weeks)几个星期的课程。我只需要找到他们不在场的那几周。例如:

Names

Name
-----
Jon
Frank

Weeks

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

我正在尝试写一个查询,告诉我约翰错过了第3周,而弗兰克错过了第2周。我很茫然,因为我似乎无法完成这项工作。提前感谢您提供任何帮助!

2 个答案:

答案 0 :(得分: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

从我的头脑中,我确信有更好的解决方案。

答案 1 :(得分:0)

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

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;

这很快又脏,但应该有效。我建议在设计数据库时使用database normalizationprimary keys来查看indexes等主题。