2011-01-07 7 views
1

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

Теперь запросить это у меня следующее:

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, ...) и т. Д.

+0

мое решение было слияние обоих Ronnis и Колючий Норман. Я делаю так: «GROUP_CONCAT» ((concat (sc.sid, '=', sc.sname) SEPARATOR ','), так как school_obj'' – Luci

ответ

4

Вы можете использовать функцию агрегации 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 
+0

звучит интересно, я заметил, что вы добавили группу в неправильное положение. должен быть после того, где, но ваши методы действительно помогли. Спасибо. – Luci

+0

О, да, вы правы. Я отредактировал его сейчас, спасибо :) –

1

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

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 = Haganässkolan).
  • example_2 содержит Csv строку школьных идентификаторами (1,2,3)
  • example_3 содержит строку CSV имен классов (Кембридж, Оксфорд, Haganässkolan)
+0

Мне нравится эта часть concat (sc.sid, '=', sc.sname) – Luci

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