2011-07-29 37 views
1

我是PHP的新手,並且遇到查詢困難,我認爲這應該相當簡單。我有一張帶有名單(Names)的表格,另外一張我有這些名字的名字加上幾周,他們參加了一個爲期4周的課程(Weeks)的課程。我只需要找出他們不在場的幾周。例如:PHP - 在範圍內查找丟失的數據

Names

Name 
----- 
Jon 
Frank 

Weeks

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

我想寫一個查詢,告訴我,約翰錯過本週三,和弗蘭克錯過本週二我因爲我無法完成這項工作,我感到很茫然。提前感謝您提供任何幫助!

+0

你是否還有星期列表? –

+0

你能改變你如何儲存你的信息嗎?通過表格你是指一個數據庫表格還是一個表格上的表格? –

+0

基督徒,我可以添加一個星期列表,如果這會有所幫助。凱文,是的,它是一個數據庫表。感謝大家的幫助。 – EMS

回答

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 

只是從我的頭頂,我敢肯定有其進行更好的解決方案。

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 keysindexes

+0

如果你downvote,請發表評論如何改進此答案。 @andrás:我想你想要一個'CROSS JOIN',而不是'INNER JOIN'。使用主鍵也是一個非常有效(和好)的建議。 +1從我(如果你修復你的內部/交叉連接) – knittl

+0

@ knittl謝謝,當然,我的意思是交叉連接。 –

+0

工作就像一個魅力...!謝謝大家的時間和幫助。安德拉斯,我一定會考慮DB正常化等,再次感謝.... – EMS