Выборка MySql (многие ко многим)

298
10 июля 2017, 16:33

Есть такая таблица:

Как видно? у Иванова и Сидорова идентичный набор учеников. Как вытащить из таблицы Иванова и Сидорова? Или как вытащить данные учителей с одинаковым набором учеников?

Answer 1

Поиск всех учителей у которых строго заданный набор учеников:

SELECT teacher_id 
  FROM `teacher_student` a
 GROUP BY teacher_id
HAVING count(1)=4 and sum(student_id IN (10,7,9,8))=4

Поиск учителей у которых есть как минимум данные ученики, но, возможно, не только они:

SELECT teacher_id 
  FROM `teacher_student` a
 WHERE student_id IN (10,7,9,8)
 GROUP BY teacher_id
HAVING count(1)=4
Answer 2

В чем проблема, просто делаем запрос:

SELECT teacher_id FROM your_table WHERE student_id='$1' AND student_id='$2' ... AND student_id='$n';

Условия WHERE надо будет сформировать программно в зависимости от того, какой вы используете язык программирования. Например, для PHP будет такой код:

$where = array();
foreach ($students as $a) $where[] = "student_id='".$a."'";
$where = implode(" AND ", $where);

где $students набор id учеников, а $where - наши условия поиска.

P.S. Также настоятельно рекомендую назначить на колонку student_id индекс.

Answer 3

Нашел отличное решение

SELECT teacher_id 
FROM   `teacher_student` a
WHERE  student_id IN (10,7,9,8) AND
        EXISTS 
        (
            SELECT  1
            FROM    `teacher_student` b
            WHERE   a.teacher_id = b.teacher_id
            GROUP   BY teacher_id
            HAVING  COUNT(DISTINCT student_id) = 4
        )
GROUP  BY teacher_id
HAVING COUNT(*) = 4

https://stackoverflow.com/questions/16461707/mysql-only-in-equivalent-clause

Работает.

А как интересно можно сделать выборку учителей у который данный на вход набор учеников В ТОМ ЧИСЛЕ среди его учеников?

READ ALSO
Конструкция if then else mysql

Конструкция if then else mysql

Как правильно написать запрос

309
вывод значений на экран через GUI Java

вывод значений на экран через GUI Java

я мало что понимаю в java, поэтому я не могу сделать вывод результатов вычислений на экранкак можно это сделать в данном случае? пока сделать...

492
Дублирование загружаемой информации в loader

Дублирование загружаемой информации в loader

Загружаю разные списки с фильмами в лоадере + реализовал простой бесконечный скроллингИспользую FragmentStatePagerAdapter для отображения разных списков

233
SimpleDateFormat высчитывает даты неправильно

SimpleDateFormat высчитывает даты неправильно

Доброго времени сутокЕсть файл, от которого мне нужно узнать, насколько давно он был создан

250