SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 09.09.2011 13:57:22

ser5027
Участник
Зарегистрирован: 09.09.2011
Сообщений: 3

Связь таблиц

Доброе время суток!
Я только начинаю плотно работать с СУБД MySQL и у меня возникла такая проблема. Мне нужно создать базу в которой будет две таблицы, это таблица фирм и таблица услуг. Каждая фирма может предоставлять несколько разных услуг и в тоже время каждая услуга может выполнятся разными фирмами. Подскажите как можно это реализовать рациональней всего. Заранее спасибо.

Неактивен

 

#2 09.09.2011 14:04:41

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

Re: Связь таблиц

Отношение многие-ко-многим традиционно реализуется введением третьей таблицы,
содержащей id из первых двух.

Неактивен

 

#3 09.09.2011 14:15:07

ser5027
Участник
Зарегистрирован: 09.09.2011
Сообщений: 3

Re: Связь таблиц

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

Неактивен

 

#4 09.09.2011 14:34:02

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Связь таблиц

новую запись

Неактивен

 

#5 10.09.2011 02:29:46

ser5027
Участник
Зарегистрирован: 09.09.2011
Сообщений: 3

Re: Связь таблиц

Спасибо большое за подсказку! Если еще кто-то подскажет как написать запрос который при выборе фирмы будет выводить все услуги которые предоставляет эта фирма...я буду очень благодарен!

Неактивен

 

#6 10.09.2011 13:16:10

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

Re: Связь таблиц

SELECT s.*
FROM services s
JOIN services2companies s2c ON s.id = s2c.service_id
JOIN companies c ON c.id = s2c.company_id
WHERE c.name = 'ООО Носки больших размеров';

Неактивен

 

#7 27.12.2015 16:53:39

Antropomorfniy
Участник
Зарегистрирован: 27.12.2015
Сообщений: 14

Re: Связь таблиц

Здравствуйте, тоже есть вопросы по связям. У меня есть таблица из 13-ти столбцов, которая по сути является набором id-шников. Эти id соответствуют id из других 13-ти таблиц с двумя столбцами, кроме id, в них находятся различные значения. То есть, содержимое, для первой таблицы фактически собирается из других 13-ти.
В  "phpMyAdmin" в "Структуре" таблицы, а точнее под структурой, находится кнопка "связи". В ней, для каждого столбца, удобно добавлять соответствующую таблицу. Ну и в соответствующих таблицах, так же  в "Структуре" в "связи" указать "Выбор отображаемого столбца".
На данный момент, мне в первой таблице всё красиво выводит, то есть полное и правильное содержимое прямо как в представлениях. Для первой таблицы создал "Представление", тоже удалось связать через "Дизайнер", так что мне видны полностью все поля.

Для того что бы было видно все поля, точнее нужное мне содержимое, в параметрах включил "Отображение связанного поля".

Пока что не дошёл до того что бы вывести на страницу сайта, первую таблицу. Даже не знаю что выйдет, толе вернёт числа(id), толе уже собранную таблицу.

___________________

Первый вопрос, что я получу если сделаю простой запрос (SELECT *  FROM `b` WHERE 1; ) к первой таблице? И если получу id-шники? Как мне сделать так что бы выводило именно содержимое других 13-ти таблиц? Так же как это выглядит при включенном параметре "Отображение связанного поля" в "phpMyAdmin". Может есть какой-то "параметр"? 

Если это реализуется:
Второй вопрос, как выглядит SQL запрос, для того что бы, задать такие "связи", как я организовал. И как выглядит SQL запрос для 13-ти таблиц, чтобы  указать "Выбор отображаемого столбца". Что бы не делать эту муторную работу в ручную.

___________________

Понимаю что при создании админки сайта,  и редактировании полей таблиц, простого решения не будет, но хотя бы для вывода данных, хотелось бы упростить себе жизнь. Есть необходимость часто делать операции по назначению "связей", и конечно же, не хотелось бы делать это вручную, отнимает уйму времени.
У меня 5-ть статических сайтов, суммарно более 2000 страниц, все по одной тематике и с одинаковой структурой, пробую их распарсить и сразу поместить данные в 5-ть таблиц, из каждой таблицы выполняю разброс по 13-ти таблицам. Всё время где-то что-то не совсем правильно обрабатывается (речь о PHP парсере), приходится пере создавать таблицы, и проделывать одни и те-же операции. С разбросом значений по 13-ти таблицам, через SQL запросы, проблем нету, но вот назначать "связи", в ручную, уже умаялся.

Спасибо за помощь

p.s. Пробовал ADD FOREIGN KEY, но в "связях" остались пустые поля, зато появилась запись в таблице "Индексы". То есть выполняет совершенно не то что мне нужно.

Отредактированно Antropomorfniy (27.12.2015 17:30:16)

Неактивен

 

#8 27.12.2015 18:19:00

Antropomorfniy
Участник
Зарегистрирован: 27.12.2015
Сообщений: 14

Re: Связь таблиц

Существует подобное решение

SELECT t.id_tovar, t.name, c.name
FROM country c, tovar t
WHERE t.id_country = c.id_country

Представленный выше пример, для решение поставленной задачи. Оно как бы решение, но когда нужно вывести все значения из 13-ти связанных таблиц, придется сильно по извращаться с WHERE и значениями FROM. Хотелось бы увидеть что-то вроде,
SELECT * FROM `country` c WHERE 1 RELATIONAL_DISPLAY(c)
или
SELECT * FROM RELATIONAL `country` c WHERE 1

Очень надеюсь что существует что то подобное, удобное и простое. Кроме того, в интернете есть такие же запросы на решение задачи подобным образом. Но простого ответа так и не нашёл.
Если подобной реализации, SQL запроса, не существует, тогда вообще непонятно зачем весь этот функционал и представление таких связей, реализовано в  phpMyAdmin. Типа для того чтобы просто было!? Тогда я разочарован.

Отредактированно Antropomorfniy (27.12.2015 18:25:33)

Неактивен

 

#9 27.12.2015 21:32:10

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Связь таблиц

Решение есть и вы его уже написали, только понятней переписать в явном виде через JOIN

SELECT t.id_tovar, t.name, c.name
FROM country c JOIN tovar t ON t.id_country = c.id_country;

Таким образом можно соединять много таблиц http://dev.mysql.com/doc/refman/5.7/en/join.html

phpadmin видимо и делает такие запросы, когда вы ставите галочки для установки связей.

Неактивен

 

#10 28.12.2015 08:05:56

Antropomorfniy
Участник
Зарегистрирован: 27.12.2015
Сообщений: 14

Re: Связь таблиц

На сколько я понимаю JOIN выполняет склейку, то есть опять же запрос к 13-ти таблицам будет, длинной строкой. И опять же мне непонятно как это связанно с той архитектурой которую я строю в phpMyAdmin.
Тут даже дело принципа, я потратил кучу времени что бы разобраться с phpMyAdmin, увидел возможность связать таблицы прямо в программе, построил на этой структуре, представление моих таблиц. В итоге не могу просто обратиться к одной уже готовой таблице, которая визуально для меня готова, получить сразу сборку из 13-ти таблиц. Зачем весь этот функционал в phpMyAdmin, если по факту он ничего не даёт?
То есть если мне нужно писать такие необоснованно длинные запросы, опять же, для связи и проделывания тех же операций, которые уже были выполнены в ручную в phpMyAdmin. Тогда ни о какой релятивности баз, речь не может идти. Как бы возможность организовать связи вручную, существует, но каждый раз проделывать такие операции. Проще вообще всё оставить в одной таблице. И не городить этот разброс, эту псевдо оптимизацию, которая вылазит в сплошной геморой.
Тут или MySQL нужно развиваться, или phpMyAdmin по функционалу порезать, раз уж толку от него ноль.

Может быть существуют какие то короткие запросы к phpMyAdmin через PHP? Я могу как то обратиться к phpMyAdmin? Могу вытянуть из него, готовое представление таблицы с отображением связанных полей?
Точнее не отображением, а получить массив. как при запросе к MySQL

Думаю все вздохнули бы с облегчением если бы в MySQL появилась возможность обращаться только к одной таблице на базе уже построенной модели/структуры связей. Включением какого не будь простого параметра, типа RELATIONAL. И вспоминали бы прошлые дни как ночной кошмар.

Отредактированно Antropomorfniy (28.12.2015 08:49:46)

Неактивен

 

#11 28.12.2015 10:00:28

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Связь таблиц

Antropomorfniy, Вы путаете оптимизацию и нормализацию - цели у этих действий разные.
Мы здесь мало знаем о функционале PMA, но если приведете скриншот, будет легче понять о создании каких структур идет речь. PMA - просто программа на PHP, поэтому обращаться к ней нет смысла. Насколько я знаю ее принцип работы, все сделанное отражается на структуре базы, а функционал PMA определяется функционалом MySQL. Описанное Вами похоже на Представления (View). В этом случае к ним можно обращаться, используя имя представления как имя таблицы. Вы пишете, что уже видите как табличные данные - на этой же странице PMA должен быть SQL-запрос, который произвел эти данные.

Неактивен

 

#12 28.12.2015 11:10:34

Antropomorfniy
Участник
Зарегистрирован: 27.12.2015
Сообщений: 14

Re: Связь таблиц

Добавил бы скриншот, но не вижу возможность залить на форум изображение.
Просто мне приходится заниматься очень странными вещами, сначала я делаю более 20 запросов для того что бы разбросать из одной таблицы, в разные, опять же для первой таблицы пере присвоить значения на id из 13-ти, меняю им тип вместо TEXT на TINYINT. А в итоге для получения данных мне приходится заниматься склеиванием, в другую таблицу. И всё ради того, что бы получить на выходе туже таблицу что я сделал первой, когда не выполнял эту кучу непонятных действий.

То есть я правильно понимаю, что работа в phpMyAdmin, это никому не нужная самодеятельность? Все Дизайнеры и связи, это так что бы скучно не было?

В таком случае phpMyAdmin могли тупо ограничиться выведением имеющихся таблиц, и не городить кучу того функционала который они на городили!

Отредактированно Antropomorfniy (28.12.2015 11:24:43)

Неактивен

 

#13 28.12.2015 11:22:03

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Связь таблиц

Если нажмете "Ответить", перейдете на полную форму ответа, в которой есть прикрепление файла

Неактивен

 

#14 28.12.2015 11:25:59

Antropomorfniy
Участник
Зарегистрирован: 27.12.2015
Сообщений: 14

Re: Связь таблиц

Спасибо, добавляю. Правда не знаю как мне это поможет.


Прикрепленные файлы:
Attachment Icon Представление базы.jpg, Размер: 832,877 байт, Скачано: 523

Неактивен

 

#15 28.12.2015 11:28:12

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Связь таблиц

Действительно речь идет о представлениях, которые созданы в базе MySQL. В программе можете обращаться к созданным представлениям по именам main_view и content_view.

Например,

SELECT * FROM main_view LIMIT 10;

Неактивен

 

#16 28.12.2015 11:38:56

Antropomorfniy
Участник
Зарегистрирован: 27.12.2015
Сообщений: 14

Re: Связь таблиц

Представления созданы для того что бы не было возможности менять поля на прямую. Кроме того они выглядят так:

Отредактированно Antropomorfniy (28.12.2015 11:39:10)


Прикрепленные файлы:
Attachment Icon С отключенным отображением связей.jpg, Размер: 815,731 байт, Скачано: 551

Неактивен

 

#17 28.12.2015 11:39:46

Antropomorfniy
Участник
Зарегистрирован: 27.12.2015
Сообщений: 14

Re: Связь таблиц

И так


Прикрепленные файлы:
Attachment Icon С включенным отображением связей.jpg, Размер: 758,870 байт, Скачано: 574

Неактивен

 

#18 28.12.2015 12:16:12

Antropomorfniy
Участник
Зарегистрирован: 27.12.2015
Сообщений: 14

Re: Связь таблиц

А вот результат обращения к таблице меню
SELECT * FROM main_view ORDER BY id

Та цифра что выделена, теоретически должна быть заменена, на значение из таблицы file_name именем файла
И так должно быть, во всех столбцах и строках.
Точно так же должны выводится таблица content_view. А на практике я получаю цифры.


Прикрепленные файлы:
Attachment Icon Выводит на странице моего сайта.jpg, Размер: 427,766 байт, Скачано: 486

Неактивен

 

#19 28.12.2015 14:02:20

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Связь таблиц

Цифра не меняется так как в представлении хранится именно цифра. Для ваших целей нужно один раз сделать представление, в котором будут хранится нужные значения, т.е. при создании используйте join

create view main_view as select ... join .. ;

http://sqlinfo.ru/articles/info/9.html

Неактивен

 

#20 28.12.2015 15:12:14

Antropomorfniy
Участник
Зарегистрирован: 27.12.2015
Сообщений: 14

Re: Связь таблиц

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

Неактивен

 

#21 28.12.2015 16:19:50

Antropomorfniy
Участник
Зарегистрирован: 27.12.2015
Сообщений: 14

Re: Связь таблиц

Нашел ещё проще способ.



CREATE VIEW main_view AS SELECT c.`id` , m.`url` , l.`leng` , p.`partition` , f.`file_name` , c.`title`
FROM `pages_content` c, `main` m, `file_name` f, `leng` l, `partition` p
WHERE m.`id` = c.`url`
AND l.`id` = c.`leng`
AND p.`id` = c.`partition`
AND f.`id` = c.`file_name`

 

Отредактированно Antropomorfniy (28.12.2015 19:07:58)

Неактивен

 

#22 30.12.2015 18:59:36

Antropomorfniy
Участник
Зарегистрирован: 27.12.2015
Сообщений: 14

Re: Связь таблиц

Возникла новая проблема, может кто поможет

Нужно создать viewContent

из таблиц Categ (id, categ) и Content (id, perent_categ, categ)

Пишу так


CREATE VIEW viewContent
 
AS SELECT co.`id`, ct.`perent_categ`, ct.`categ`
 
FROM `Content` co, `Categ` ct
 
WHERE  ct.`id` = co.`perent_categ`
AND      ct.`id` = co.`categ`;
 


не работает

пробовал ещё так


CREATE VIEW viewContent
 
AS SELECT co.`id`, ct.`perent_categ`, cg.`categ`
 
FROM `Content` co, `Categ` ct, `Categ` cg
 
WHERE  ct.`id` = co.`perent_categ`
AND      cg.`id` = co.`categ`;
 


результат тот же.

Конечно могу создать ещё два одинаковых представления для Categ (id, categ) с разными именами и уже из них разбрасывать, но мне кажется это извращением

Неактивен

 

#23 30.12.2015 19:03:25

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Связь таблиц

Ваше условие AND выполняется только если категория совпадает с родительской. Возможно, Вы имели в виду OR

Неактивен

 

#24 30.12.2015 19:09:14

Antropomorfniy
Участник
Зарегистрирован: 27.12.2015
Сообщений: 14

Re: Связь таблиц

Да, совпадает

Неактивен

 

#25 30.12.2015 19:11:24

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Связь таблиц

Поясните что имеете в виду под "не работает". Какая-то ошибка или результат не соответствует ожиданиям?

Неактивен

 

Board footer

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