2017-01-30 16 views
0

私は2つのテーブルを持っています.1つはプロジェクトのリストと各プロジェクトに割り当てられ、もう1つは請負業者に関する名前と情報。PHP/SQL:完全に異なるテーブルに存在しないテーブルから値を選択する方法

"Projects_table" 
Project_ID Contractor_assigned Job_Complete 
1    Jim Smith    1 
2    John Smith    0 
3    Edward Smith   0 
4    Smith Smith   1 
5    Candle Stick   1 

"Contractors_Table" 
Contractor_ID Name    Drywall  Insulation 
1    Jim Smith   1   0 
2    John Smith  0   1 
3    Edward Smith  0   1 
4    Smith Smith  0   1 
5    Jack BeNimble  0   1 
6    Jack BeQuick  1   0 
7    Candle Stick  0   1 

私は必要なもの、私は現在、どのジョブに割り当てられていない特定のタイプ(乾式壁または絶縁体)の請負業者のリストを与えるSQLクエリを引っ張っていますそのジョブも「完了」とマークされていない限り、

私はこの数のバージョンを試してみましたが、ありません成功しました:

SELECT 
Name FROM Contractors_Table 
WHERE Contractors_Table.Insulation=1 
AND Name NOT IN 
(SELECT Contractor_assigned FROM Projects_table WHERE `Job_Complete` = 0) 

私は私の上記の例からの出力のために望んでいることは取り戻すことです。

Jack BeNimble 
Candle Stick 

もの2つの絶縁体は現在、「完全な」仕事を除いて仕事を割り当てられていない。

+0

umm。私はこれを理解していません。「仕事に割り当てられていない場合、その仕事にも「完了」と書かれていない限り、どの仕事にも割り当てられません。 –

+0

外部の参加がそれになります – Dave

+0

@GordonLinoff "Projects_Table"がかなり大きいので、例えば、Jim Smithが過去に50のプロジェクトに割り当てられていた可能性があります。"私は現在、仕事に利用できる請負業者のリストが必要です。つまり、彼は現在、他の現役の仕事に割り当てられていないかどうかを知る必要があります。私は、泥だと分かります... – Graeme

答えて

1

代わりNOT EXISTSを使用する必要があります。

SELECT Name 
    FROM Contractors_Table c 
WHERE c.Insulation = 1 
    AND NOT EXISTS 
     (SELECT 1 
      FROM Projects_table p 
     WHERE p.Job_Complete = 0 
      AND p.Contractor_assigned = c.Name) 

あなたはあなたがやろうとしているクエリをリファクタリングできますが、NOT INを使用するには、はるかに手間がかかります。

また、名前の代わりにforeign keysを使用してデータを比較する必要があります。あなたは、リレーショナル・データベース内の情報を複製、まずNormalization rules

+0

しかし、私は "WHERE Con​​tractors_Table.Insulation = 1"を "WHERE Insulation = 1"に変更しなければなりませんでした。 – Graeme

+0

クエリが動作するように更新されました。私の間違いは、テーブルエイリアスの使用を忘れてしまいました。 –

1

に従わないあなたのテーブルの設計が間違っているしている:あなたは、自分の名前のプロジェクトテーブルにContractor_IDを保存し、そしてべきではありません(同音異義語で何が起こるか???)

第2に、正しいと思われるためにクエリが結果を返さない理由を理解できません。あなたはNameという名前の列があり、これは予約済みのキーワードである、そしてあなたは、このように `

とそれを囲む必要があります。とにかく、あなたがOUTER JOINでそれを書き換えることができますNOT IN

を行うには、効率的なことはないかもしれないので:

SELECT C.`Name` 
FROM Contractors_Table C 
LEFT JOIN Projects_table P ON C.`Name` = P.`Contractor_assigned` AND P.`Job_Complete` = 0 
WHERE C.Insulation=1 
    AND P.ID IS NULL --> This will ensure that you only get those who are not in the Project table 
0

明らかに2つのクエリ(各タイプに1つ)。両方のテーブルで一意のIDを使用する場合は、テーブルを結合してContractors_Table.drywall = 0およびProject_Table = 0(Contractor IDでグループ化する)を選択できます。

私はあなたのデータをあなたのテーブルでソートしてからクエリを書くことについて考えています。

HTH :-)

関連する問題