1

我有两个表 tblteacher 和 tblattendance 有共同的 tshortname 字段。现在我想显示 tblteacher 的 tshortname 和状态为“是”,如果对于 tblattendance 中的特定日期我在 tblattendance 中也有 tshortname 否则状态应该是“否”

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

这是我执行上述查询时显示的数据

在此处输入图像描述

日期-'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 将处理前两个中的连接,但会将其与第三个表中的所有行匹配 - 这是您出错的地方。

编辑:根据您的评论,这可能更适合您按预期获取所有行。

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 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 回答
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 回答