SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 30.08.2010 17:18:49

Globulopolis
Участник
Зарегистрирован: 17.09.2009
Сообщений: 23

Нужна помощь в проектировании БД и выборке данных

Есть таблицы

table1
id | name1 | name2 | name3
1
2
3
4

table2
pid | name1
1    Alabama
2    NY
3    LA

table3
mid | name2
1    John
2    Amy
3    Bob

table4
id | name3
1    flying
2    traveling
3    sailing

Нужно получить в результатах при выборке из table1 примерно следующее

1 | flying, traveling | Alabama, LA | John, Bob
2 | sailing, flying | NY, LA | Amy

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

PS! Тип исходных таблиц MyISAM. Кол-во запросов тоже критично.

Неактивен

 

#2 30.08.2010 19:00:30

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Нужна помощь в проектировании БД и выборке данных

Таблица, реализующая отношение многие-ко-многим, — это просто два числа.

Например:
Таблица А (id_a, name_a, …)
Таблица B (id_b, name_b, …)
Таблица A2B (id_a, id_b)

Сущности задаются в соответствующих таблицах (в Вашем примере это table2-4),
связи — в таблицах сущность2сущность (их нужно создать).

Неактивен

 

#3 31.08.2010 15:48:16

Globulopolis
Участник
Зарегистрирован: 17.09.2009
Сообщений: 23

Re: Нужна помощь в проектировании БД и выборке данных

paulus сделал таблицы как вы указали. получилось 9 штук(много разных данных для одной записи). Можно ли как-то оптимизировать или оставитькак есть?

Также интересует вопрос о самом sql запросе. Пример такого запроса, т.к. через JOIN видимо неравильно я делаю.

Неактивен

 

#4 31.08.2010 20:18:42

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Нужна помощь в проектировании БД и выборке данных

SELECT * FROM A JOIN A2B USING (id_a) JOIN B USING (id_b)?

Неактивен

 

#5 01.09.2010 10:45:33

Globulopolis
Участник
Зарегистрирован: 17.09.2009
Сообщений: 23

Re: Нужна помощь в проектировании БД и выборке данных

такс... видать где-то я ошибся или что-то не допонял...
таблица countries

cid    cn
1    USA
2    American Samoa
3    Honduras

таблица actions

aid    aname
1    flying
2    sailing
3    traveling

таблица names

id    name    name_intl
1    Amy    Amy
2    John    John
3    Adam    Adam

теперь связи
таблица rel_cn

rid    rid_cn
1    1
1    2
2    1
3    1
3    2
3    3

таблица rel_actions

rid    r_aid
1    2
1    3
2    3
3    1
3    3

в результате нужно получить

id    name        action        countries
1    Amy        sailing, traveling    USA, American Samoa
2    John        traveling        USA
3    Adam        flying, traveling    USA, American Samoa, Honduras

Если использовать вышеприведенный запрос то получаю Unknown column 'rid' in 'from clause'

SELECT * FROM names JOIN rel_actions USING (rid) JOIN actions USING (r_aid)

Отредактированно Globulopolis (01.09.2010 10:46:55)

Неактивен

 

#6 01.09.2010 11:17:32

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Нужна помощь в проектировании БД и выборке данных

Ну, да, у Вас же нету колонки rid в names.

Можете вместо USING использовать ON rel_actions.rid = names.id. Ну и
аналогично для других таблиц.

Неактивен

 

#7 01.09.2010 16:03:23

Globulopolis
Участник
Зарегистрирован: 17.09.2009
Сообщений: 23

Re: Нужна помощь в проектировании БД и выборке данных

получилось, но не совсем то что ожидалось
вместо

1    Amy        sailing, traveling    USA, American Samoa

получается

1    Amy        sailing    USA

результаты сгруппированы по names.id

Неактивен

 

#8 01.09.2010 17:02:11

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Нужна помощь в проектировании БД и выборке данных

Не-а, без полного текста запроса не отвечу smile

Неактивен

 

#9 02.09.2010 09:08:16

Globulopolis
Участник
Зарегистрирован: 17.09.2009
Сообщений: 23

Re: Нужна помощь в проектировании БД и выборке данных

SELECT *
FROM names
INNER JOIN rel_actions ON rel_actions.rid = names.id
LEFT JOIN actions ON actions.aid = rel_actions.r_aid
INNER JOIN rel_cn ON rel_cn.rid = names.id
LEFT JOIN countries ON countries.cid = rel_cn.rid_cn
WHERE published = 1
GROUP BY id


если использовать IN то все равно возвращается 1 результат из присоединяемых.

Неактивен

 

#10 02.09.2010 11:39:58

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Нужна помощь в проектировании БД и выборке данных

Эм. А где группировочные функции?

Возьмите одну вот такую таблицу:
id | value
----------
1  | 1
1  | 2
2  | 3
2  | 4
и поиграйте с группировками с ней:
SELECT id, MAX(value) FROM tablename GROUP BY id;
SELECT id, AVG(value) FROM tablename GROUP BY id;
SELECT id, GROUP_CONCAT(value) FROM tablename GROUP BY id;

Над всеми полями, не входящими в GROUP BY должна стоять группировочная
функция. Иначе MySQL берет одно абстрактное число из соответствующего
поля.

Неактивен

 

#11 06.09.2010 12:02:09

Globulopolis
Участник
Зарегистрирован: 17.09.2009
Сообщений: 23

Re: Нужна помощь в проектировании БД и выборке данных

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

т.е.

SELECT name.*, ra.*, GROUP_CONCAT(act.aname), rcn.*, GROUP_CONCAT(cn.cn)
FROM names AS name
INNER JOIN rel_actions AS ra ON ra.rid IN (name.id)
LEFT JOIN actions AS act ON act.aid IN (ra.r_aid)
INNER JOIN rel_cn AS rcn ON rcn.rid IN (name.id)
LEFT JOIN countries AS cn ON cn.cid IN (rcn.rid_cn)
WHERE published = 1
GROUP BY id


возвращает

1 Amy        sailing, traveling,sailing, traveling    USA, American Samoa
2 John       traveling                                     USA

или нельзя так группировать в одном запросе?

Отредактированно Globulopolis (06.09.2010 12:03:31)

Неактивен

 

#12 06.09.2010 17:13:57

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Нужна помощь в проектировании БД и выборке данных

Представьте, что перед вами геометрические фигуры разных цветов.
Ваш запрос выглядит так:
«Скажи тип фигуры и перечисли размеры по цветам».

Я бы от такого запроса сошел с ума. MySQL чуть более умный, и не
сходит с ума — но он все равно не понимает, что Вы хотите. Попробуйте
начать с того, что поймете, что Вы хотите получить, для себя. А потом
напишете группировочные функции над всеми полями, которые
не входят в GROUP BY.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson