Две таблицы и мультикатегории

Globulopolis

Новичок
Две таблицы и мультикатегории

Здравствуйте!
Структура 1-ой таблицы movie
id | genre| movie
1 | 2,3 | alias
2 | 3,2 | alias2
3 | 1,3 | alias3

Структура 2-ой таблицы genre
gid| g_genre
1 | name1
2 | name2
3 | name3

Нужно получить данные одной строкой и вывести их в цикле.

Запрос: SELECT a.id, a.genre, a.movie, b.gid, GROUP_CONCAT(b.g_genre) AS g FROM movie AS a LEFT JOIN genre AS b ON b.gid IN (2,3) WHERE published = 1

Результат:
id genre gid g
1 1,2,3 2 alias2,alias3,alias2,alias3

т.е. получается что результат дублируется. Дальше ещё хуже. если через for выводить полученные данные то в поле g попадает не alias2,alias3,alias2,alias3, а только alias2. И если к примеру результатов 10 то запрос выводит только одну строку. Собстно в чем затык ?

PS! Просьба тапками не пинать. Структура базы досталась в наследие. Поэтому посоветуйте что можно исправить либо может вообще перепроектировать БД ?
 

zerkms

TDD infected
Команда форума
такие вещи делаются через отдельную таблицу связи
relation: genre_id | movie_id
 

Globulopolis

Новичок
угу ясно. так а теперь отсюда вытекает ещё вопрос. если к примеру помимо таблицы genre будет ещё 3 таблицы с примерно таким содержанием, и в первой таблице соответствующие извенения, можно ли relation для этих таблиц сделать в одной таблице или нужно для каждой отдельно таблицу связей делать ?

приведу таблицы чтобы наглядней было

id movie_name
1 Трансформеры: Месть падших
2 Трансформеры: Месть падС?РёС…

gid g_genre
1 alias1
2 alias2
3 alias3

r_genre_id r_movie_id r_people_id r_theatre_id
1 1 0 0
2 1 0 0
2 2 0 0
3 1 0 0
3 2 0 0

правильно сделал ?
 

zerkms

TDD infected
Команда форума
Globulopolis
неправильно
каждая пара параметров должна соединяться через свою таблицу связей (если параметры относятся как многие-к-многим).
а у тебя как раз М:М
потому как:
1. у кино может быть несколько жанров
2. кино может идти в нескольких кинотеатрах
3. в кино снялись несколько актёров
 

Globulopolis

Новичок
такс... помучаю ещё :)

сделал так.
movie
id catid movie_name
1 1 Трансформеры: Месть падших
2 2 Трансформеры: Месть падС?РёС…

genre
gid g_genre
1 alias1
2 alias2
3 alias3

rel_genre
r_genre_id r_movie_id
1 1
2 1
2 2
3 1
3 2

далее запрос
SELECT a.r_genre_id, a.r_movie_id, b.gid, b.g_genre, c.id, c.catid
FROM rel_genre AS a
LEFT JOIN genre AS b ON b.gid = a.r_genre_id
LEFT JOIN movie AS c ON c.catid = a.r_movie_id
WHERE published = 1
ORDER BY id DESC

в результате
r_genre_id r_movie_id gid g_genre id catid movie_name
2 2 2 alias2 2 2 Трансформеры: Месть падС?РёС…
3 2 3 alias3 2 2 Трансформеры: Месть падС?РёС…
1 1 1 alias1 1 1 Трансформеры: Месть падших
2 1 2 alias2 1 1 Трансформеры: Месть падших
3 1 3 alias3 1 1 Трансформеры: Месть падших

наверное опять не так сделал... чьёрт побьери... это ж если выводит через цикл куча записей будет...
 
Сверху