2011-07-29 19 views
1

私はPHPを使い慣れていないし、質問が難しいと思っています。私は名前のリスト(Names)と1つのテーブルを持っています、そして、私はこれらの名前を4週間コースのクラス(Weeks)に参加した週に結び付けました。私は単に彼らが存在しなかった週を見つける必要があります。たとえば:PHP - 範囲内に見つからないデータを見つけよう

Names

Name 
----- 
Jon 
Frank 

Weeks

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

私はジョンが週3を逃し、そしてフランクは週2 Iを逃したことを私に語ったクエリを記述しようとしています私はこの仕事をすることができないので、紛失している。あなたが提供できるあらゆる助けをありがとうございます!

+0

あなたにも週のリストがありますか? –

+0

情報の保存方法を変更できますか?そして、テーブルによって、あなたはデータベーステーブルまたはページ上のテーブルだけを意味しますか? –

+0

クリスチャン、もしこれが助けになるなら、私は数週間のリストを追加することができます。ケビン、はい、それはデータベーステーブルです。皆さんのお手伝いをありがとうございます。 – EMS

答えて

2

あなたは違いをすべて出席を含むテーブルを作成します(クロス結合)してから取ることができる:

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

MySQLはJOIN/NOT INを使用することによって、あなたがそれを回避する必要が直接minusをサポートしていませんので、/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:私はあなたが '内部ジョイン 'ではなく、'クロスジョイン'を望むと思います。主キーを使用することも非常に有効な(そして良い)アドバイスです。私からの+1(内部/クロス結合を修正した場合) – knittl

+0

@knittlありがとう、もちろん私はクロス結合を意味しました。 –

+0

チャームのように働いて...!時間と助けをいただき、ありがとうございました。アンドラ、私は確かにDBの正規化、等を見ていきます。もう一度おかげで.... – EMS

関連する問題