![]() |
|
Модераторы: skyboy |
![]()
|
|
| ida |
|
|||
![]() замужем ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2277 Регистрация: 14.5.2002 Где: Санкт-Петербург Репутация: 1 Всего: 58 |
Есть три связанных таблицы - films, company, links1, содержащие такие поля:
films: id_film, name_film, year, duration, video_qual, audio_qual company: id_com, name_com links1: film_id, com_id Первая со второй связаны через третью, содержащую уникальные пары значений. Нужно написать запрос, который получает из переменной (скажем, var1) значение, ищет по нему в таблице links1 все пары, где com_id = var1, потом лезет в таблицу films, находит все строки с соответствующими id_film и печатает на экране результат в виде: name_film | year | name_com | duration | ... и т.д. Когда делаю такой запрос:
то печатает по 25 строк с одинаковым film_name. Переменная var1 может принимать как раз 25 значений (24 - количество записей в таблице company, + пустая строка). Что здесь не так?... |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 6 Всего: 39 |
используй оператор join
|
|||
|
||||
| ida |
|
|||
![]() замужем ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2277 Регистрация: 14.5.2002 Где: Санкт-Петербург Репутация: 1 Всего: 58 |
ответ неправильный. У меня три таблицы (сейчас, а будет больше) - я видел примеры с JOIN только для двух таблиц. Еще варианты есть?...
|
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 6 Всего: 39 |
ida
t1 left join t2 on t1.a=t2.b left join t3 on t2.c=t3.d left join t4 on t4.e=t3.f и т.д. ... |
|||
|
||||
| boevik |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1452 Регистрация: 31.5.2004 Где: Израиль Репутация: 2 Всего: 35 |
Не определена связь между таблицами links1 и company
WHERE links1.com_id = $var1 AND links1.film_id = films.id_film AND links1.com_id = company.id_com -------------------- Никогда не говори никогда |
|||
|
||||
| someone312002 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 17.2.2003 Репутация: нет Всего: нет |
этот тип связи называется много ко многим... то бишь один фильм может быть выпущен больше, чем одной компанией и, в то же времени одна компания выпускает не один, а много фильмов.
films: id, name_film, year, duration, video_qual, audio_qual company: id, name_com links1: film_id, com_id Тады запрос, который тебе будет нужен такой: SELECT films.name_film, films.year, company.name_com, films.duration, films.video_qual, films.audio_qual FROM links1, films, company WHERE company.name_com like @var1 --ограничит выбор до одной фирмы and company.id = links1.com_id --выберет только соответсвующие условию линки and films.id = links1.film_id --выберет проходящие по условию фильмы ПРОБУЙ! УДАЧИ!!! |
|||
|
||||
| ida |
|
|||
![]() замужем ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2277 Регистрация: 14.5.2002 Где: Санкт-Петербург Репутация: 1 Всего: 58 |
Спасибо! Попробую.
|
|||
|
||||
| ida |
|
|||
![]() замужем ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2277 Регистрация: 14.5.2002 Где: Санкт-Петербург Репутация: 1 Всего: 58 |
boevik оказался прав, аналогичным образом нормально склеились 6 таблиц, все работает без JOIN'ов.
|
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 6 Всего: 39 |
ida
смысл в том, что если у тебя хотя бы в одной таблце не будет необходимой информации запрос без join пропустит информацию в других таблицах мимо ушей, а это не есть хорошо. ИМХО. При соединении таблиц лучше пользоваться join, это позволит вдальнейшем избежать некоторых глюков. |
|||
|
||||
| boevik |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1452 Регистрация: 31.5.2004 Где: Израиль Репутация: 2 Всего: 35 |
Конструкция INNER JOIN и то что применила ida это одно и то же, только синаткс различен.
В MSSQL execution plan одинаков для обоих запросов. INNER JOIN вошел в язык SQL позже, поэтому и оставили поддержку ранней версии через WHERE и условия связей. Что применять, дело вкуса. -------------------- Никогда не говори никогда |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 6 Всего: 39 |
boevik
Смысл в том, что если есть фирма в company, но она ещё не выпустила не одного фильма её не покажут. Если использовать join, то её покажут с пустым списком фильмов. |
|||
|
||||
| boevik |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1452 Регистрация: 31.5.2004 Где: Израиль Репутация: 2 Всего: 35 |
Secandr
не совсем верно, если использовать INNER JOIN, то не покажет. Покажет если использовать OUTER JOIN левый или правый. OUTER JOIN можно выполнить и через конструкцию WHERE используя вместо знака = знаки *= или =* что соотвествует LEFT OUTER JOIN и RIGHT OUTER JOIN -------------------- Никогда не говори никогда |
|||
|
||||
| Secandr |
|
||||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 6 Всего: 39 |
boevik
я про left join и говорил А вот про "*= или =*" я ещё не слышал, пойду попробую. Добавлено @ 15:07
Так что в mYsql без join не обойтись! |
||||
|
|||||
| ida |
|
|||
![]() замужем ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2277 Регистрация: 14.5.2002 Где: Санкт-Петербург Репутация: 1 Всего: 58 |
Так мне и не нужно показывать фирмы, которые не выпустили ни одного фильма. Я же фильмы ищу, а не фирмы. Может это не совсем ясно было из постановки задачи - компании в данном случае играют роль атрибута фильма, нет фильма - нет и атрибута. Это сообщение отредактировал(а) ida - 3.6.2004, 19:08 |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 6 Всего: 39 |
ida Моё дело предупредить
|
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |