Как использовать Union решить эту проблему полного внешнего соединения под MySQL - PullRequest
0 голосов
/ 28 июля 2011

Вот таблица

 stuid stuname subject grade
 1     alex    algo    99
 1     alex    dastr   100
 2     bob     algo    90
 2     bob     dastr   95
 3     casy    algo    100
 4     Daisy   dastr   100

case1: при условии, что в таблице только две темы. Ниже приведен ожидаемый результат

 stuname algo dastr 
 alex    99    100
 bob     90    95
 casy    100   0
 Daisy   0     100

Я думаю, что следующий - это выполнимый запрос

select g1.stuname,
       COALESCE(g1.grade,0) as algo
       COALESCE(g2.grade,0) as dastr
from grades g1 
full outer join grades g2 on g1.stuid = g2.stuid
where g1.subject = algo and g2.subject = dastr;

Но mysql не поддерживает полное внешнее соединение.Есть ли другой способ решения проблемы?

Кроме того, случай 2, если предположить, что в таблице есть неизвестное количество субъектов и ожидаемый результат будет

stuname subj1 subj2 subj3 ... subjn

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

Ответы [ 3 ]

2 голосов
/ 28 июля 2011

Ваши запросы будут работать лучше, если вы реструктурируете свои таблицы.Вы пытаетесь хранить слишком много информации в одной таблице.Вот предлагаемая структура:

Students
student_id student_name
1          Alex
2          Bob
3          Casy
4          Daisy

Subjects
subject_id subject_name
1          Algo
2          Dastr

Grades
student_id subject_id grade
1          1          99
1          2          100
2          1          90
2          2          95
3          1          100
4          2          100

В классах student_id и subject_id будет составным ключом, означающим, что уникальная комбинация двух становится уникальным идентификатором (студент 1, предмет 1 уникален для студента 1,тема 2)

Чтобы вернуть данные, основанные на вашем комментарии, попробуйте:

  SELECT a.student_name, b.subject_name, c.grade
    FROM students a, subjects b, grades c
   WHERE a.student_id = c.student_id
     AND b.subject_id = c.subject_id
ORDER BY a.student_id
0 голосов
/ 28 июля 2011

Из ваших существующих данных ...

select 
      stuid,
      max( stuName ) stuName, 
      max( if( subject = "algo", grade, 000 )) as Algo,
      max( if( subject = "dastr", grade, 000 )) as Dastr
   from 
      Grades
   group by
      stuid
   order by
      stuName

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

Однако реструктуризация данных, предложенная @DN, была бы более чистым подходом.

0 голосов
/ 28 июля 2011

Вы пробовали что-то вроде:

SELECT a.stuid as sidA, a.grade as grA, a.grade as grB
FROM grades a JOIN grades b ON (a.stuname = b.stuname)

Но, как предположил DN, возможно, стоит реструктурировать ваши таблицы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...