Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Еще раз о связывании таблиц 
V
    Опции темы
vikaz
Дата 14.5.2009, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: нет
Всего: 12



Формучане, всем доброго вечера.
Возник следующий вопрос.
Я создаю две базы. В первой базе (M_Table) идут сл. поля:
  •  M_Code тип int(Свойства: PK, Unsigned, Increment)
  •  M_Line тип char[100]

есть вторая таблица (D_Table) в ней есть сл. поля:
  •  D_Num тип int(Свойства: PK, Unsigned, Increment)
  •  D_Code тип int (Свойства:Unsigned)
  •  M_Line тип char[100]

Я решил связать две таблицы c отношением ОДИН-КО-МНОГИМ.
Для этого создал индекс для второй таблицы по полю D_Code.
После чего создал отношение.

Вопрос, как использовать данное преимущество в своих программах. Если не сложно покажите SQL кодом, как с этим работать.

ЗЫ. Код всех действий которые я проделал выше не показываю, т.к. его нет. Все делалось под Виндой через SQLyog.   


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
Gwire
Дата 14.5.2009, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 7.8.2007
Где: Николаев

Репутация: 1
Всего: 4



smile vikaz, чесно говоря, не совсем понятно это:
Цитата(vikaz @  14.5.2009,  20:40 Найти цитируемый пост)
Я создаю две базы. В первой базе (M_Table)...
...
есть вторая таблица (D_Table)...

Где есть вторая таблица? В первой базе или уже во второй? Если во второй, то оригиральная у тебя задача. Хотя это можно организовать указав имена БДs, но лучше так не делать:
Код
select * from db1.table1, db2.table2 where db1.table1.id = db2.table2.db1_table1_id; /* или */
select * from db1.table1 x1, db2.table2 x2 where x1.id = x2.db1_table1_id;


поле id в db1.table1 -> INT, PrimaryKey или Unique, а лучше РК+auto_increment.
поле db1_table1_id в db2.table2 -> INT, и можно + Index

самособой в поле db1.table1.id заносятся данные <"один">, а в db2.table2.db1_table1_id - <"многие">
smile 

PM MAIL   Вверх
vikaz
Дата 15.5.2009, 04:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: нет
Всего: 12



Цитата(Gwire @  14.5.2009,  23:21 Найти цитируемый пост)
Где есть вторая таблица? В первой базе или уже во второй?

Все в одной базе.... Не будем ничего усложнять..... smile


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
vikaz
Дата 15.5.2009, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: нет
Всего: 12



????


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
azesmcar
Дата 15.5.2009, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Цитата(vikaz @  14.5.2009,  20:40 Найти цитируемый пост)

Я решил связать две таблицы c отношением ОДИН-КО-МНОГИМ.
Для этого создал индекс для второй таблицы по полю D_Code.
После чего создал отношение.

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

если надо связать - значит так оно и надо, если не надо - преимуществ разумеется не будет. Тут надо исходить из требований задачи а не из того что просто взял и решил попробовать "ОДИН-КО-МНОГИМ". smile 

Это сообщение отредактировал(а) azesmcar - 15.5.2009, 08:43
PM   Вверх
vikaz
Дата 15.5.2009, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: нет
Всего: 12



Цитата(azesmcar @  15.5.2009,  08:43 Найти цитируемый пост)
если надо связать - значит так оно и надо, если не надо - преимуществ разумеется не будет. Тут надо исходить из требований задачи а не из того что просто взял и решил попробовать "ОДИН-КО-МНОГИМ".


Ну мы все учимся, и нечего в том что я просто решил связать плохо нет. А вообще, так действительно нужно. Вот связал я эти две таблицы, но какой от этого толк не пойму. Язык SQL позволяет задать любое условие для поиска, но какой + именно в этом случае не знаю. Поэтому и прошу разъяснить. Может строка запроса на языку SQL будет меньше, ведь ссылаясь на строку в первой таблице, должно автоматически находится соответствующие значения во второй. Но вот как правильно написать это запрос не знаю.   smile  


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
azesmcar
Дата 15.5.2009, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Цитата(vikaz @  15.5.2009,  09:02 Найти цитируемый пост)
Ну мы все учимся, и нечего в том что я просто решил связать плохо нет

плохого действительно ничего нет, но надо учиться на правильных примерах, хотя если это учебная задача - то все в порядке smile 
пример н.1 (простое связывание этих таблиц) 
Код

select * from table_M m, table_D d where d.D_Code=m.M_Code


пример н.2 (подсчет количества соответствующих значений в таблице table_D) 
Код

select m.M_Code, count(d.D_Code) from table_M m, table_D d
   where d.D_Code=m.M_Code
   group by m.M_Code


пример н.3 (вывод тех записей, которым в таблице table_D соответствует более 3х записей) 
Код

select m.M_Code from table_M m, table_D d
   where d.D_Code=m.M_Code
   group by m.M_Code
   having count(d.D_Code) > 3


возможно где-то в примерах ошибочки допустил, здесь писал..но смысл этот
PM   Вверх
vikaz
Дата 15.5.2009, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: нет
Всего: 12



Цитата(azesmcar @  15.5.2009,  09:09 Найти цитируемый пост)
возможно где-то в примерах ошибочки допустил, здесь писал..но смысл этот 

Спасибо, сегодня попробую дома, просто БД и среда разработки не на работе.  Спасибо. Будут вопросы, обязательно задам.


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
Gwire
Дата 15.5.2009, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 7.8.2007
Где: Николаев

Репутация: 1
Всего: 4




Цитата(azesmcar @  15.5.2009,  09:09 Найти цитируемый пост)
пример н.2 (подсчет количества соответствующих значений в таблице table_D)

код SQL
1: select m.M_Code, count(d.D_Code) from table_M m, table_D d
2:   where d.D_Code=m.M_Code
3:   group by m.M_Code

пример н.4   
Если значения в table_D которые удовлетворяют условие D_Code=M_Code отсутствуют...
А нужно отображать все записи из table_M:
Код

SELECT M_Code,
    (SELECT count( D_Code ) FROM table_D WHERE M_Code = m.M_Code) AS D_count
FROM table_M m;


PM MAIL   Вверх
azesmcar
Дата 15.5.2009, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Цитата(Gwire @  15.5.2009,  10:01 Найти цитируемый пост)
пример н.4   
Если значения в table_D которые удовлетворяют условие D_Code=M_Code отсутствуют...
А нужно отображать все записи из table_M:

 smile 
outer join smile 

Это сообщение отредактировал(а) azesmcar - 15.5.2009, 10:20
PM   Вверх
vikaz
Дата 15.5.2009, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: нет
Всего: 12



Сделаю свои умо заключения. Если не так поправьте. Связывание двух таблиц в одной базе в данном случае просто повышает скорость обработки запросов и все?


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
azesmcar
Дата 15.5.2009, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Цитата(vikaz @  15.5.2009,  11:25 Найти цитируемый пост)
Сделаю свои умо заключения. Если не так поправьте. Связывание двух таблиц в одной базе в данном случае просто повышает скорость обработки запросов и все? 

ну не то чтобы просто ))
в принципе если зауматься то - да..без связки можно обойтись, все это вручную делать самому, если еще задуматься то и без базы данных можно обойтись...можно ведь все в файлах хранить.
связка таблиц настолько облегчает труд программиста (я еще не говорю о повышении эффективности) что сложно представить как без нее обойтись. Представь ситуацию когда тебе нужно к примеру получить данные из 10-15 таблиц, и попробуй представить как обойтись без связки.
PM   Вверх
Gwire
Дата 15.5.2009, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 7.8.2007
Где: Николаев

Репутация: 1
Всего: 4




Цитата(azesmcar @  15.5.2009,  10:19 Найти цитируемый пост)
outer join

Согласен что такое решение тоже имеет место.
Но это уже на любителя.
Тем более есть задачи, где проще использовать вложеный селект.
Пример привести не вспомню. Но такая задача у меня была.
Пытался с join smile и запутался.

Так что - "на любителя".


PM MAIL   Вверх
azesmcar
Дата 15.5.2009, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Цитата(Gwire @  15.5.2009,  11:44 Найти цитируемый пост)

Согласен что такое решение тоже имеет место.
Но это уже на любителя.
Тем более есть задачи, где проще использовать вложеный селект.
Пример привести не вспомню. Но такая задача у меня была.
Пытался с join smile и запутался.

Так что - "на любителя".

вложенный селект - намного медленее, не могу придумать ситуации когда outer join стоило бы заменить на вложенный

Цитата(Gwire @  15.5.2009,  11:44 Найти цитируемый пост)
Пытался с join smile и запутался.

это не значит что так правильнее smile
PM   Вверх
vikaz
Дата 15.5.2009, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: нет
Всего: 12



Цитата(azesmcar @  15.5.2009,  09:09 Найти цитируемый пост)
Выделить всёкод SQL
    
select * from table_M m, table_D d where d.D_Code=m.M_Code


пример н.2 (подсчет количества соответствующих значений в таблице table_D) 
    
select m.M_Code, count(d.D_Code) from table_M m, table_D d
   where d.D_Code=m.M_Code
   group by m.M_Code


пример н.3 (вывод тех записей, которым в таблице table_D соответствует более 3х записей) 

select m.M_Code from table_M m, table_D d
   where d.D_Code=m.M_Code
   group by m.M_Code
   having count(d.D_Code) > 3



azesmcar, ты хочешь сказать, что код который находится выше, будет работать только если есть связь между таблицами? Просто я еще не проверил, только вечером. Но вопрос возник сейчас.


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0935 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.