2013-09-05 3 views
1

У меня есть две таблицы tblteacher и tblattendance с общим полем tshortname. Теперь я хочу показать tshortname из tblteacher и статус как «да», если для конкретной даты в tblattendance у меня также есть tshortname в tblattendance, иначе статус не должен быть «нет»выборка данных из двух таблиц в mysql

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 

здесь данные, которые показываются, когда я выполнить приведенный выше запрос

enter image description here

данные, приведенные на дату-'2013-07-01' является для некоторых учителей. Я не получаю, где проблема is.Please помочь мне решить эту проблему

Update:

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; 

enter image description here

Теперь я всегда получаю 42 строк и правильный статус в соответствии с датой в attenadance Таблица

+0

Вы выбираете из 3 таблиц без присоединения к любым полям. Плохо. –

+0

Я тоже пытался присоединиться, но рассмотрим случай, когда у вас есть запись в tblteacher, но не в tblattendance для конкретной даты, тогда она не покажет эту строку, но нам нужна эта строка со статусом no ... вы можете использовать join i будет реализовывать это, но решить мою проблему – rupinder18

+0

Затем используйте левое соединение с любой функцией mssql, эквивалентной ifnull(). –

ответ

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 
+0

ваш запрос возвращает yes для всех значений, независимо от того, изменяю ли я дату – rupinder18

+0

@ rupinder18. Затем в запросе есть декартовое объединение. Я догадался о взаимосвязи между двумя таблицами, но когда у вас есть несколько совпадающих строк данных в запросе, и вы не указываете, к чему присоединяться таблицы, он будет возвращать ВСЕ соответствующие строки на основе условий в вашем запросе. – Fluffeh

+0

У меня есть всего 42 строки в таблице tblteacher, и я хочу, чтобы мой запрос всегда возвращал 42 строки и статус как yes и no соответственно – rupinder18

0

Вы должны налево присоединиться к таблице посещаемости, а затем

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

Edit: Полный запрос

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 
+0

Я попробовал то, что вы сказали, но не получил правильные данные – rupinder18

+0

Я отредактировал свой ответ, чтобы включить полный запрос. Это должно сработать. Что неверно? В вашем обновленном вопросе вы используете подзапрос, который не рекомендуется. – Vlad

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'; 
Смежные вопросы