Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Взаимодействие двух таблиц  (Прочитано 12673 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dracul
Помогающий

ru
Offline Offline
Пол: Мужской

« : 29-06-2006 05:00 » new

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

Я пытался сделать следующем образом.:
Создал третью таблицу (музыканты_и_песни), в которой хранились пары – название песни и имя музыканта (точнее их индексы).
И запрос на вывод песен, в которых принимал участие какой-то музыкант.
Запрос: SELECT `название_песни`, `индекс_песни` FROM `музыка` WHERE (select count(if(`песня`=` индекс_песни ` AND `музыкант`='15', 1, NULL)) from `музыканты_и_песни`)>0
То есть, выбрать только те песни, которые в таблице музыканты_и_песни имеют пару индекс своей песни и индекс музыканта (например 15)
« Последнее редактирование: 06-12-2007 18:52 от Алексей1153++ » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 29-06-2006 06:38 » 

приведи структуру таблиц
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Alf
Гость
« Ответ #2 : 29-06-2006 07:17 » 

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

Типичное отношение многие-ко-многим: каждую песню играет много музыкантов, и каждый музыкант играет много песен. Типовое решение - завести 3 таблицы: таблицу песен (БЕЗ указания музыкантов, поскольку это нарушит 1-ю реляционную нормальную форму), таблицу музыкантов и таблицу связи (два столбца - ключ песни и ключ музыканта, который играет данную песню).

Только я бы сделал немного иначе, поскольку одну песню могут играть разные группы. Добавил бы информацию, в составе какой группы данный музыкант играл эту песню. Иначе потом не разберешься.
Записан
Dracul
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 29-06-2006 20:21 » 

я кажется понял в чем у меня возник вопроссик.
Я сделакл, как предложил Alf (в смысле было сделанно так изначально), вот тока я лопухнулся, и выбор нужных песен делал следующим образом: делал запросс к таблице с песнями и проверял, есть ли индекс песни в таблице со свяями, относительно нужного музыканта.... Жаль Отлично
Кстати, а можно акто получить все результат одним запроссом?
Записан
Alf
Гость
« Ответ #4 : 29-06-2006 21:27 » 

Вот быстренько набросал прототип в MS Access.

1. Таблица музыкантов (tbMusician):

Код:
ID	Name
1 Ken Hensley
2 Mark Knopfler

2. Таблица песен (tbSong):

Код:
ID 	Name
1  July Morning
2  Wizard
3  Lady In Black
4  Money For Nothing
5  Walk Of Life
6  Heavy Fuel

3. Таблица связи (tbSongMusician):

Код:
SongID	MusicianID
1 1
2 1
3 1
4 2
5 2
6 2

А теперь - запрос, который выбирает из нашей базы песни, исполненные Кеном Хенсли:

Код:
SELECT tbSong.Name
FROM tbSong
WHERE tbSong.ID IN
  (SELECT tbSongMusician.SongID FROM tbSongMusician WHERE MusicianID =
    (SELECT tbMusician.ID FROM tbMusician WHERE tbMusician.Name = "Ken Hensley")
  );

(файл прилагается).

* Music.rar (8.02 Кб - загружено 1025 раз.)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines