Понимание того, как MySQL выбирает данные с тем же идентификатором пользователя - PullRequest
0 голосов
/ 21 марта 2012

Я работаю за столом, который ведет учет посещающих курс студентов.Данные хранятся с использованием идентификационного номера студента, идентификатора курса, названия курса, даты начала, даты окончания.Студент может пройти более одного курса, поэтому есть повторяющийся идентификационный номер студента, но с другим идентификатором курса, названием курса, датой начала и датой окончания.Здесь я пытаюсь выбрать студентов по количеству дней, используя DATEDIFF.

Извините за неправильное объяснение моей проблемы.структура таблицы, о которой я говорю:

studcourse1(internalstudentid, staffnoic, courseid, coursenm, StDt, EndDt, location, organizer, generalcategorycd, generalsubcategorycd, eid)

staffnoic - идентификационный номер персонала, StDt - дата начала.EndDt - дата окончания

Я проверил, в этой таблице нет первичного ключа или индексов, так как это не основа, а представление.

Извините, если предыдущий оператор слишком длинный.Давайте вместо этого воспользуемся этим.

SELECT GradeGroupCd, StudCourse1.StaffNoIC, (DATEDIFF( EndDt, StDt ) +1) TotalDay, StDt, EndDt
          FROM StudCourse1, tblStaff, tblRefTitleGred
          WHERE tblStaff.TitleGredCd = tblRefTitleGred.TitleGredCd
          AND StudCourse1.StaffNoIC = tblStaff.StaffNoIC
          AND StDt >= '2009-1-1' AND YEAR(EndDt) <= YEAR(NOW())
          AND (DATEDIFF( EndDt, StDt ) +1) > 90
          AND (GeneralSubCategoryCd = 'S0012' OR GeneralSubCategoryCd = 'S0014')
          GROUP BY GradeGroupCd, StudCourse1.StaffNoIC

Вышеприведенное утверждение извлекает результаты для студента (используя staffnoic из таблицы tblStaff и таблицы StudCourse1), прошедшего курс более 90 дней с использованием (DATEDIFF (EndDt, StDt) + 1),Что меня действительно смущает, так это, например, запись из studcourse1 с staffnoic '111111111111', пример данных:

studcourse1(internalstudentid, staffnoic, courseid, coursenm, StDt, EndDt, location, organizer, generalcategorycd, generalsubcategorycd, eid)
studcourse1(10629,111111111111,AAA1811,Course1,2010-01-01 00:00:00, 2010-12-31 00:00:00, '', ABC Org, G003, S0012, E00001812)
       (30684,111111111111,AAA6968,Course2,2009-02-10 00:00:00, 2012-02-09 00:00:00, '', ABC Org, G003, S0012, E00006894)
       (30685,111111111111,AAA6970,Course3,2011-01-01 00:00:00, 2012-02-09 00:00:00, '', ABC Org, G003, S0014, E00006896)

При выполнении оператора SQL будет выбрана запись с StDt 2010-01-01 00: 00: 00 и EndDt 2010-12-31 00:00:00.Почему выделяется эта запись, а не другие, поскольку все они подпадают под AND StDt> = '2009-1-1' AND YEAR (EndDt) <= YEAR (NOW ()) ". <strong>Год, теперь относящийся к 2012 году. Как я могу сделать так, чтобы он выбирал тот, у которого есть StDt (2009-02-09) и EndDt (2012-02-09)?

И также "(DATEDIFF (EndDt, StDt) +1)> 90 ", почему он добавляет 1 к нему? Разве DATEDIFF (EndDt, StDt)> 90 не подходит?

Извините, если слишком много вопросов. Просто изучите MySQL недавно. Спасибо заваше время.

1 Ответ

1 голос
/ 21 марта 2012

Хорошо, трудно понять, что вы написали. Пожалуйста, предоставьте таблицы, которые вы использовали, и структуру.

Самый простой способ сделать это - иметь 3 таблицы, 1) студенты с идентификатором, именем и т. Д. 2) Course - идентификатор курса, название курса и так далее. 3) Регистрация - идентификатор регистрации, дата начала, дата окончания и внешние ключи (идентификатор студента и идентификатор курса).

И я не понял, что вы имели в виду (я пытаюсь здесь выбрать студентов по количеству дней, используя DATEDIFF.)

...