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