отношения многие ко многим MySQL выберите - PullRequest
1 голос
/ 07 января 2011

Рассмотрим 2 таблицы «школы» и «студенты». Теперь ученик может принадлежать к разным школам в своей жизни, и в школе много учеников. Так что это пример многих ко многим. В третьей таблице «ссылки» указывается отношение ученика к школе.

Теперь, чтобы запросить это, я делаю следующее:

Select sc.sid , -- stands for school id
       st.uid,  -- stands for student id
       sc.sname, -- stands for school name
       st.uname, -- stands for student name
       -- select more data about the student joining other tables for that
from students s
left join links l on l.uid=st.uid  -- l.uid stands for the student id on the links table
left join schools sc on sc.sid=l.sid -- l.sid is the id of the school in the links table
where st.uid=3 -- 3 is an example

этот запрос вернет дубликаты данных для идентификатора пользователя, если у него более одной школы, поэтому, чтобы исправить это, я добавил group by st.uid, но мне также нужен список названий школ, связанных с тем же пользователем. Есть ли способ сделать это с помощью исправления запроса, который я написал вместо двух запросов? Так что в качестве примера я хочу иметь Люси из школ (X, Y, Z, R, ...) и т. Д.

Ответы [ 2 ]

4 голосов
/ 07 января 2011

Вы можете использовать агрегатную функцию GROUP_CONCAT: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat.

Например:

Select st.uid,  -- stands for student id
       st.uname, -- stands for student name
       GROUP_CONCAT sc.sname SEPARATOR ', ' as school_names,
       -- select more data about the student joining other tables for that
from students s
left join links l on l.uid=st.uid  -- l.uid stands for the student id on the links table
left join schools sc on sc.sid=l.sid -- l.sid is the id of the school in the links table
where st.uid=3 -- 3 is an example
group by st.uid
1 голос
/ 07 января 2011

некрасиво, но работает.

select st.uid
      ,st.uname
      ,group_concat(concat(sc.sid,'=',sc.sname)) as example1
      ,group_concat(sc.sid)                      as example2
      ,group_concat(sc.sname)                    as example3
  from students     st
  left join links    l on l.uid  = st.uid
  left join schools sc on sc.sid = l.sid
 where st.uid = 3
 group 
    by st.uid
      ,st.uname;
  • example_1 дает вам пары значений, например (1 = Кембридж, 2 = Оксфорд, 3 = Хаганяссколан).
  • example_2 содержит строку csv школьных идентификаторов (1,2,3)
  • example_3 содержит строку csv школьных названий (Кембридж, Оксфорд, Хаганяссколан)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...