2014-02-18 4 views
0

Цель: Мне было поручено экспортировать сложный набор данных из приглашения на консультацию по PHP в webapp и преобразовать его в файл excel, содержащий данные учащихся, отсортированные по их STUDENT_ID.SELECT * FROM несколько таблиц, группа по ID

У меня есть 3 таблицы MySQL, содержащие данные. Все они имеют поле STUDENT_ID.

Мне нужно сделать запрос, который извлекает все данные из 4 таблиц, группируя их в одну строку на основе STUDENT_ID.

Некоторые из таблиц содержат несколько записей для одного и того же STUDENT_ID. Если возможно, мне бы хотелось, чтобы эти несколько записей объединены в одну строку (так что каждый уникальный STUDENT_ID находится на одной строке).

Это то, что у меня есть до сих пор, но, похоже, оно не работает, как я ожидаю.

SELECT * 
from ssp_student t1 
INNER JOIN ssp_student_quarterly t2 
ON t1.STUDENT_ID = t2.STUDENT_ID 
INNER JOIN ssp_weekly_progress t3 
ON t2.STUDENT_ID = t3.STUDENT_ID 
GROUP BY t1.STUDENT_ID 

Таблица схема:

Table 1: 
| STUDENT_ID | PEER_COACH_ID | ACTIVE | COHORT | WEEKLY_MEETING_TIME | FYE_ID | RC | AGREEMENT_SIGNED | RELEASE_SIGNED | NOTES | FACULTY_ADVISOR | 

Table 2: 
| STUDENT_ID | QUARTER | COUNSELLING_OFFICE | WRITING_CENTER | CASE_MANAGEMENT | SSP_SOCIAL_EVENTS | SSP_SUCCESS_SEMINAR | HOME_SUPPORT | ACCOMODATION_USED | DISCOVERY_PATHWAYS | PEER_COACHING | 

Table 3: 
| STUDENT_ID | QUARTER | WEEK | EMAIL_INTERACTION | PHONE_INTERACTION | TEXT_INTERACTION | INPERSON_INTERACTION | SOCIAL_INTERACTION | NUMBER_OF_SOCIAL_INTERACTIONS | CASE_MANAGEMENT_INTERACTIONS | NUMBER_OF_CASE_mANAGEMENT_INTERACTIONS | SUCCESS_SEMINAR_INTERACTION | NUMBER_OF_SUCCESS_SEMINAR_INTERACTIONS | OTHER_INTERACTION | THEMES | SURVEY_ID | NOTES | 

, что мне нужно: Я хочу 1 строку для каждого STUDENT_ID, которая содержит столбцы для всех данных, связанных с этим STUDENT_ID в таблицах 1, 2 и 3.

+3

Пожалуйста, сообщите нам, что вы ожидаете и почему это не работает, как вы ожидаете. Ваша схема базы данных также поможет нам. –

+1

Здесь есть две проблемы: (1) Если в некоторых таблицах есть несколько строк с этим student_id, вы получите бесполезный результат (только одна из соответствующих строк) и (2) Если некоторые таблицы не содержат ничего об этом ученике - Ты этого не получишь. По второй причине - рассмотрим 'LEFT JOIN' – poncha

+0

@DamienBlack Я отредактировал OP с схемой DB и более подробной информацией. – Prefix

ответ

0

если вы используете SELECT *, и вы говорите, что некоторые из таблиц содержат более одной строки для одного и того же ученика, y ou никогда не получит только одну строку. Попробуйте выбрать поля, связанные с идентификатором студента, который вы хотите отобразить.

Если какое-либо из полей, которые вы хотите отобразить, является одним из нескольких элементов, то оно не будет работать, оно отображает одну строку для каждой записи.

+1

Собственно, это неправильно. В конце он группирует результат по идентификатору ученика, поэтому на одного ученика будет ровно одна строка. Но для таблиц с более чем одной строкой в ​​исходном соединении - только одна (непредсказуемая, какая) строка будет использоваться в результате. – poncha

+0

Я имею в виду, * вы никогда не получите только одну строку *, это не правда ... остальное есть;) – poncha

+0

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

0

Если вы действительно хотите объединить данные для каждой строки в одно поле, ваше SELECT заявление вы могли бы сделать что-то вроде следующего:

SELECT t1.STUDENT_ID, GROUP_CONCAT(t2.Field1 SEPARATOR ', ') AS t2Field1Concat, 
         GROUP_CONCAT(t2.Field2 SEPARATOR ', ') AS t2Field2Concat, 
         GROUP_CONCAT(t3.Field1 SEPARATOR ', ') AS t3Field1Concat, 
         GROUP_CONCAT(t3.Field2 SEPARATOR ', ') AS t3Field2Concat 

В приведенном выше примере вы должны сделать это для каждого поля кроме t1.STUDENT_ID.

0

Кажется, что после 4 отдельных групп данных, которые практически не имеют ничего общего, кроме идентификатора студента. Вы должны выполнить один запрос для каждого, а затем объединить данные в соответствующий формат в PHP.

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

+0

Im открыт для всех способов подхода к этому. вы правы, данные очень разрозненные. Какова ваша рекомендация по индивидуальному запросу и их объединению? Просто выберите * по STUDENT_ID в каждой таблице один за другим? Конечный результат должен быть отформатирован для экспорта в формате CSV. – Prefix

+0

Ну, тогда это зависит от требований к формату CSV-данных, а также от данных исходных данных. Может ли это быть только один CSV-файл с одной строкой на одного учащегося? У всех этих таблиц есть соотношение 1: 1? Если это да для обоих, или да ко второму вопросу, то один вариант будет вашим лучшим вариантом. Если у вас есть отношения 1: n или m: n между любыми из этих таблиц, вы, вероятно, должны экспортировать данные в отдельные CSV-файлы, используя несколько запросов. – Sammitch

Смежные вопросы