2016-12-20 3 views
0

ジョインステートメントのいくつかのMySQLテーブルからデータを抽出しようとするときに問題があります。ジョインが選択されていない行が戻ってくる

私のテーブルと属性は、次のとおりです。

appointment_end_time (table) 
    appointment_end_time_id (int)(pk)(ai) 
    appointment_end_date (datetime) 

    appointment_start_time (table) 
    appointment_date_id (int)(pk)(ai) 
    appointment_start_date (datetime) 

    instructor(table) 
    instructor_id (int)(pk)(ai) 
    firstname varchar(45) 
    lastname varchar(45) 

    appointment_timetable 
    appointment_timetable_id int(11) AI PK 
    instructor_id int(11) FK 
    appointment_date_id int(11) FK 
    appointment_end_time_id int(11) FK 


SELECT a.appointment_timetable_id, i.instructor_id, ad.appointment_start_date, aet.appointment_end_date 
FROM db12405956.appointment_timetable a 
JOIN instructor i on i.instructor_id = a.instructor_id 
JOIN appointment_start_time ad on ad.appointment_date_id = a.appointment_date_id 
JOIN appointment_end_time aet on aet.appointment_end_time_id = a.appointment_end_time_id 
ORDER BY a.appointment_timetable_id; 

しかし、このコードは、選択されていない行を実行する場合ので、私は私が間違ってやって思ったんだけど、どんな助けを思い出させるん大いに感謝されます

サンプル行: (appointment_end_time)

 appointment_end_time_id appointment_end_date 
        1   2016-12-26 14:00:00 
        2   2016-12-24 13:00:00 
        3   2016-12-26 13:00:00 
         (appointment_start_time) 

    appointment_date_id appointment_start_date 
        1   2016-12-26 15:00:00 
        2   2016-12-24 16:00:00 
        3   2016-12-26 15:30:00 

    instructor_id  firstname  lastname 

      1    Sasha   Thompson 

      2    Laura   Robinson 

      3    John   Walters 

         appointment_timetable 


appointment_timetable_id instructor_id appointment_date_id appointment_end_time_ 

     1    Blank    Blank    Blank 

     2    Blank    Blank    Blank 

     3    Blank    Blank    Blank 
+1

問題を示すために十分なサンプルデータを表示します。 –

+1

これは、1つ以上のテーブルにリレーションシップを行うためのデータがないことを意味します。インストラクターやstart_times、end_timesのないアピインメントがあるので、何も戻ってこない。これはデータの問題であり、あなたは何も表示していないので、これを言うことは不可能です。 – JNevill

+0

@JNevillだから、たとえば9人のインストラクターと3人の開始時間と終了時間がありますが、それは何にも当てはまりますか?行の量は互いに一致する必要がありますか? –

答えて

3

あなたが必要とするのは、自分で問題を診断する方法を学ぶことです。クエリが期待どおりの結果を返さないという共通の問題があり、問題を見つけるために物事を分解する方法を理解する必要があります。

SELECT a.appointment_timetable_id, i.instructor_id, ad.appointment_start_date, aet.appointment_end_date 
FROM db12405956.appointment_timetable a 
JOIN instructor i on i.instructor_id = a.instructor_id 
JOIN appointment_start_time ad on ad.appointment_date_id = a.appointment_date_id 
JOIN appointment_end_time aet on aet.appointment_end_time_id = a.appointment_end_time_id 
ORDER BY a.appointment_timetable_id; 

あなたはそれを打破するために行うことは合流(および条件はあなたがここにはありませんがどこ)追加し、最初のテーブルで開始している、1:

のは、クエリから始めましょうデータの問題が現れるまでの時間です。これは、フィールドリストの代わりにselect *を使うか、トップ1を選択するか(通常は複数のレコードを表示することをお勧めしますのでトップ10を選択するのが最も簡単です)、関連付けられているフィールドを探す必要がないのであなたがまだ追加していない結合で

ので

SELECT top 10 * 
FROM db12405956.appointment_timetable a 
JOIN instructor i on i.instructor_id = a.instructor_id 

その後

SELECT top 10 * 
FROM db12405956.appointment_timetable a 
JOIN instructor i on i.instructor_id = a.instructor_id 
JOIN appointment_start_time ad on ad.appointment_date_id = a.appointment_date_id 

最後に

SELECT top 10 * 
FROM db12405956.appointment_timetable a 
JOIN instructor i on i.instructor_id = a.instructor_id 
JOIN appointment_start_time ad on ad.appointment_date_id = a.appointment_date_id 
JOIN appointment_end_time aet on aet.appointment_end_time_id = a.appointment_end_time_id 
ORDER BY a.appointment_timetable_id; 
を試してみてくださいそして、

SELECT top 10 * 
FROM db12405956.appointment_timetable a 

で始まります

ある時点で、レコードがどこにあるのかがわかります。これが問題の場所です。次に、参加しているフィールドとデータセット内のデータを調べて、一致するものが返されない理由を調べる必要があります。たとえば、日付を結合している場合は、1つのテーブルに日付として格納され、別のテーブルにはvarcharとして格納され、「01/01/2016」は '2016年1月1日'と等しくない場合もあります。接頭辞や接尾辞は他のテーブルにはありません。あるテーブルにはPR2345、もう1つには2345のようなものがありますが、クエリが正しく、条件を真に満たしていないことがあります。まだ完成していないため、まだ完了していないため、完了したアクションに関するデータはありません)。または、前提の一部で要件が間違っているか、一致するレコードが存在しないためです。データの入力。

問題の性質に応じて、すべてのレコードを返すか、または選択したトップ1のみを使用する必要があります(すべてのレコードが消えているため)。あまりにも多くのレコードや重複したレコードを返すときや、結果セットに影響を与えるフィールドが戻ってこないときに役立ちます。 私は最終結果セットでSELECT *を使用すると言っているわけではありませんが、ここでは診断ツールとしてのみ使用されています。

あなたのケースでは、問題は最初のテーブルにあるかのように見えます。講師IDとサンプルの他のフィールドには空白があるため、参加するものはありません。 (あなたはサンプルを与えただけなので、残りのテーブルはこれと似ていないかもしれません)。これはまだ生きていない機能のためにデータがまだ存在しない場合、あなたのクエリをテストすることができますテーブルにテストデータを追加するだけです。単体テストを完了したら、必ずこのデータを削除してください。データがそこにあるはずだった場合は、バグのためにアプリケーションから挿入を調べる必要があります。

+0

よろしくお願いします、私はそれを理解しました –

関連する問題