我有两个表 tblteacher 和 tblattendance 有共同的 tshortname 字段。现在我想显示 tblteacher 的 tshortname 和状态为"is",如果在 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
这是我执行上述查询时显示的数据
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 行和正确的状态
最佳答案
这里是表之间的经典笛卡尔连接。
你需要像这样告诉数据库如何匹配各个表中的数据:
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
关于mysql - 从mysql中的两个表中获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18636086/