2013-04-13 3 views
0

У меня есть система управления студента для моего боевых искусств клуба, различных типов информации, хранится в разных таблицах БД,Mysql группы/заказ

для посещения, и градуировок новой строки добавляется для каждого нового события.

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

Так у меня есть это:

SELECT * , COUNT(date) AS `count` 
    FROM attendance a 
    JOIN students s ON a.student_id = s.student_id 
    JOIN gradings g ON g.student_id = s.student_id 
    JOIN grades_list gl ON gl.grade = g.grade 
     WHERE s.class <>'Little Monsters' 
     AND date 
     BETWEEN'2013-01-01' 
     AND now() 
      GROUP BY a.student_id 
      ORDER BY gl.ID 

Это в настоящее время делает правильный вид вещи, но это не показывает все результаты, и если есть более чем одна запись для каждого класса лиц (что там будет в конечном итоге), он показывает один результат, но не последний. В настоящее время у меня два человека в таблице градиентов с двумя записями, один из этих людей не показан ни на одном другом, он показывает свою самую старую запись, которую он должен показывать самой новой.

Надеюсь, что все имеет смысл.

Cheers.

+0

Добавить 'GROUP_CONCAT()' для многих части 1: п отношения и 'explode' результат позже (посещаемость/градуировки?). (Или вообще не 'GROUP BY', и вы получите дубликат' student_id'.) Дополнительные примечания: вы можете денормализовать таблицы 'посещаемости' и' градации 'в одну таблицу, если они имеют строгую связь 1: 1 с ограничениями NOT NULL. А также 'grades_list' выглядит как небольшая таблица поиска. Это действительно необходимо в запросе или вообще? –

+0

Немного путайте некоторые из этих терминов, поэтому им нужно взглянуть на них сейчас. Grades_list настроил его порядок. –

ответ

0
  1. С вашего GROUP BY a.student_id каждый студент будет показан не более одного раза.

  2. Записи могут исчезнуть из-за присоединений, которые вы делаете. Если ученика нет в grades_list, присоединиться к нему нет, поэтому запись не будет показана. Вероятно, вы захотите LEFT JOIN.

+0

ах, что имеет смысл, единственное, что в grades_list - это цвет и идентификатор. Иль уйду. спасибо за быстрый ответ! –

0

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

--- если есть более чем одна запись для каждого класса лиц (которых будет в конечном счете) ---

Последние позволяют мне думать, что вы, возможно, должны redesing БД. Потеряйте таблицу grades. Это моя убежденность, что студент может иметь только один класс в любой момент времени, поэтому сделайте его атрибутом ученика. Теперь вам действительно нужно соотношение 1: n между student и attendance. И вы заказываете студентов по номеру student.grade. (Те учащиеся, которые посетили определенное мероприятие.)

Для того, чтобы сделать запись истории рейтинга учащихся, вы можете добавить таблицу grade_when_attended в таблицу attendance. Или сделайте специальную grade_history таблицу:

  • student_id, PK, FK в student_id
  • grade, PK, FK в grade_list
  • date_when_earned, date
  • ... (?)

Я предпочел бы «полный» подход к истории оценки, но это сделало бы студентов-заказчиков по степени участия в мероприятии немного сложнее.

Возможный запрос, упрощен (позволяет думать о заказе по классам и т.д. позже, если это работает):

SELECT s.* , GROUP_CONCAT(a.column1), GROUP_CONCAT(a.column1) 
    FROM students s 
    LEFT JOIN attendance a ON a.student_id = s.student_id 
    WHERE s.class <>'Little Monsters' 
    AND date 
    BETWEEN'2013-01-01' 
    AND now() 
     GROUP BY s.student_id 

Запрос выше показывает только текущий класс так все может запутаться, если новый сорт заработал в течение указанного времени период. (Быстрый и грязный решение было бы добавить grade_when_attended столбец в таблице attendance так вы получите текущий класс, и каждый класс за посещаемость в течение периода времени.)

Помните, что вам нужно GROUP_CONCAT каждый столбец отдельно:

+0

Я думаю, что, возможно, я нашел более простой способ обойти это, как вы уже упоминали ранее, добавив класс в таблицу учеников. Хотя я пытаюсь найти, кто готов к оценке, По этому поводу я использовал BETWEEN'2013-01-01 ' И теперь() i jst использовал эту дату, чтобы начать жизнь проще, в идеале будет их последней оценкой даты. , если я добавлю столбец для студентов для last_grading, есть способ, которым я могу использовать WHERE date BETWEEN s.last_grading AND now() ??? –

+0

@aaron Не уверен, что вы имеете в виду, но я думаю, нет. Если у вас есть только один столбец 'last_grading' и используйте запрос выше, вы выбираете всех студентов с любым заданным' last_grading'. Если вы заинтересованы в том, чтобы студенты, которые заработали (или участвовали), оценивали событие после 2013-01-01, используйте: 'WHERE date> '2013-01-01''. Примечание: у вас не должно быть будущих дат в таблице или вы получите нечетные результаты. Чтобы исключить будущие даты, используйте 'WHERE date BETWEEN '2013-01-01' AND NOW()' (В любом случае странно иметь будущие даты для записанных событий. Но вы могли бы иметь будущую дату для столбца типа 'next_possible_grading_event'). –

+0

Очевидно, что над 'date' должно быть' s.last_grading'. И это будет список студентов, которые заработали оценку в 2012 году: 'WHERE s.last_grading BETWEEN '2012-01-01' AND '2012-12-31''. –