Для каждой возвращенной строки также вернуть список строк, которые совпадают в некоторых других столбцах - PullRequest
0 голосов
/ 22 января 2012

Например:

У меня есть база данных учеников и последних классов, и для каждого ученика в классе я также возвращаю список всех остальных учеников в классе.Пример таблицы будет выглядеть следующим образом:

StudentID ClassID
a          1
b          1
c          1
a          2
a          3
c          2
b          3

Я хочу выбрать идентификатор ученика = класс, но также знаю, какие другие ученики будут в его классе, так:

StudentID  ClassID  Classmates
a          1        a,b,c
a          2        a,c
a          3        a,b

Я пытался делатьзапрос, подобный следующему:

SELECT * FROM
(SELECT *, GROUP_CONCAT(StudentID)
FROM enrolled GROUP BY studentID, ClassID)
AS temporary WHERE temporary.StudentID=a

Проблема заключается в том, что GROUP BY уплотняет строки, поэтому при возврате списка классов b ничего не будет показано, поскольку a имеет приоритет в столбце studentID.

Я исследовал всюду и ничего не мог найти - помочь?

1 Ответ

0 голосов
/ 22 января 2012

Возможно, вы ищете что-то вроде этого:

select e.studentid, e.classid, dt.classmates
from (
    select classid, group_concat(studentid) as classmates
    from enrolled
    group by classid
) as dt
join enrolled e on e.classid = dt.classid
where e.studentid = 'a'

Основная идея состоит в том, чтобы сгенерировать списки одноклассников, сгруппировавшись по classid, а затем соединить его с enrolled, чтобы вы могливыберите интересующего вас студента.

Когда вы используете where e.studentid = 'a', вы получите следующее:

+-----------+---------+------------+
| studentid | classid | classmates |
+-----------+---------+------------+
| a         |       1 | a,b,c      |
| a         |       2 | a,c        |
| a         |       3 | a,b        |
+-----------+---------+------------+

фильтрация по e.studentid = 'b' выходам:

+-----------+---------+------------+
| studentid | classid | classmates |
+-----------+---------+------------+
| b         |       1 | a,b,c      |
| b         |       3 | a,b        |
+-----------+---------+------------+

и фильтрация по e.studentid = 'c' дает вам следующее:

+-----------+---------+------------+
| studentid | classid | classmates |
+-----------+---------+------------+
| c         |       1 | a,b,c      |
| c         |       2 | a,c        |
+-----------+---------+------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...