1

tblteacher と tblattendance の 2 つのテーブルがあり、tshortname フィールドが共通しています。tblattendance の特定の日付について、tblattendance にも tshortname がある場合は、tblteacher からの tshortname とステータスを「yes」として表示したいと思います。それ以外の場合、ステータスは「no」にする必要があります。

select distinct(tblteacher.teachername),tblteacher.tshortname,
if(strcmp(tblteacher.tshortname,tblattendance.tshortname) and tblattendance.attdate='2013-07-01','no','yes') as status 
from tblteacher,tblclass,tblattendance

上記のクエリを実行したときに表示されるデータは次のとおりです

ここに画像の説明を入力

date-'2013-07-01' に表示されているデータは、一部の教師については正しいものです。問題がどこにあるのかわかりません。この問題を解決するのを手伝ってください

アップデート:

select distinct(tblteacher.tshortname),if (tblteacher.tshortname not in(SELECT  
distinct(t.tshortname) from tblteacher t left join tblattendance a on t.tshortname=a.tshortname 
where a.attdate='2013-07-03'),'no','yes') as status from tblteacher;

ここに画像の説明を入力

現在、出席テーブルの日付に従って、常に42行と正しいステータスを取得しています

4

3 に答える 3

1

ここにあるのは、テーブル間の古典的なデカルト結合です。

次のように、さまざまなテーブルのデータを一致させる方法をデータベースに伝える必要があります。

select distinct 
    (tblteacher.teachername),tblteacher.tshortname,
    if(strcmp(tblteacher.tshortname,tblattendance.tshortname) and tblattendance.attdate='2013-07-01','no','yes') as status 
from 
    tblteacher
        join tblclass
            on tblteacher.tshortname=tblattendance.tshortname
        join tblattendance
            on tblteacher.tshortname=tblattendance.teacherShortName

あなたの場合、strcpm は最初の 2 つの結合を処理しますが、それを 3 番目のテーブルのすべての行に一致させます。これが間違っているところです。

編集:あなたのコメントから、これは期待どおりにすべての行を取得するためにうまくいくかもしれません。

select distinct 
    (tblteacher.teachername),tblteacher.tshortname,
    if(strcmp(tblteacher.tshortname,tblattendance.tshortname) and tblattendance.attdate='2013-07-01','no','yes') as status 
from 
    tblteacher
        left outer join tblclass
            on tblteacher.tshortname=tblattendance.tshortname
        left outer join tblattendance
            on tblteacher.tshortname=tblattendance.teacherShortName
于 2013-09-05T12:22:50.577 に答える
0

出席テーブルに参加したままにする必要があります

select if(tblattendance.tshortname is not null and attdate = '2013-07-01', 'yes', 'no') as status

編集:完全なクエリ

SELECT DISTINCT
    t.tshortname,
    teachername, 
    IF(attdate = '2013-07-01','yes','no') AS status 
FROM tblteacher AS t
LEFT JOIN tblattendance AS a
       ON t.tshortname = a.tshortname
于 2013-09-05T12:35:39.913 に答える
0

推測ですが...

 SELECT DISTINCT t.tshortname
      , CASE WHEN a.shortname IS NULL THEN 'no' ELSE 'yes' END status
   FROM tblteacher t 
   LEFT
   JOIN tblattendance a 
     ON t.tshortname = a.tshortname 
    AND a.attdate = '2013-07-03';
于 2013-09-06T15:01:51.903 に答える