我是PHP新手,对查询有困难我认为应该相当容易。我有一个表格,其中包含一个名单(Names
),另一个表格中有这些名字以及他们参加课程(Weeks
)几个星期的课程。我只需要找到他们不在场的那几周。例如:
Names
:
Name
-----
Jon
Frank
Weeks
:
Name Week
----- ----
Jon 1
Jon 2
Jon 4
Frank 1
Frank 3
Frank 4
我正在尝试写一个查询,告诉我约翰错过了第3周,而弗兰克错过了第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 normalization和primary keys来查看indexes等主题。