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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> результат запроса (строки) размножается, в MySQL 
:(
    Опции темы
ida
  Дата 31.5.2004, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


замужем
****


Профиль
Группа: Завсегдатай
Сообщений: 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 | ... и т.д.

Когда делаю такой запрос:

Код
SELECT links1.com_id, links1.film_id, films.id_film, films.name_film, films.year, company.id_com, company.name_com, films.duration, films.video_qual, films.audio_qual
FROM links1, films, company
WHERE links1.com_id = $var1 AND links1.film_id = films.id_film


то печатает по 25 строк с одинаковым film_name. Переменная var1 может принимать как раз 25 значений (24 - количество записей в таблице company, + пустая строка). Что здесь не так?...

PM WWW   Вверх
Secandr
Дата 31.5.2004, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

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



используй оператор join


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
ida
Дата 31.5.2004, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


замужем
****


Профиль
Группа: Завсегдатай
Сообщений: 2277
Регистрация: 14.5.2002
Где: Санкт-Петербург

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



ответ неправильный. У меня три таблицы (сейчас, а будет больше) - я видел примеры с JOIN только для двух таблиц. Еще варианты есть?...
PM WWW   Вверх
Secandr
Дата 2.6.2004, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 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 и т.д. ...


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
boevik
Дата 2.6.2004, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 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


--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
someone312002
Дата 2.6.2004, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 --выберет проходящие по условию фильмы

ПРОБУЙ! УДАЧИ!!!
PM MAIL   Вверх
ida
Дата 2.6.2004, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


замужем
****


Профиль
Группа: Завсегдатай
Сообщений: 2277
Регистрация: 14.5.2002
Где: Санкт-Петербург

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



Спасибо! Попробую.
PM WWW   Вверх
ida
Дата 2.6.2004, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


замужем
****


Профиль
Группа: Завсегдатай
Сообщений: 2277
Регистрация: 14.5.2002
Где: Санкт-Петербург

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



boevik оказался прав, аналогичным образом нормально склеились 6 таблиц, все работает без JOIN'ов. smile.gif

PM WWW   Вверх
Secandr
Дата 3.6.2004, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

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



ida
смысл в том, что если у тебя хотя бы в одной таблце не будет необходимой информации запрос без join пропустит информацию в других таблицах мимо ушей, а это не есть хорошо.

ИМХО. При соединении таблиц лучше пользоваться join, это позволит вдальнейшем избежать некоторых глюков.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
boevik
Дата 3.6.2004, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: 2
Всего: 35



Конструкция INNER JOIN и то что применила ida это одно и то же, только синаткс различен.
В MSSQL execution plan одинаков для обоих запросов.
INNER JOIN вошел в язык SQL позже, поэтому и оставили поддержку ранней версии через WHERE и условия связей.

Что применять, дело вкуса.




--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
Secandr
Дата 3.6.2004, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

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



boevik
Смысл в том, что если есть фирма в company, но она ещё не выпустила не одного фильма её не покажут.
Если использовать join, то её покажут с пустым списком фильмов.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
boevik
Дата 3.6.2004, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: 2
Всего: 35



Secandr
не совсем верно, если использовать INNER JOIN, то не покажет.
Покажет если использовать OUTER JOIN левый или правый.

OUTER JOIN можно выполнить и через конструкцию WHERE используя вместо
знака = знаки *= или =* что соотвествует LEFT OUTER JOIN и RIGHT OUTER JOIN




--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
Secandr
Дата 3.6.2004, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

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



boevik
я про left join и говорил smile.gif Тольно в mysql достаточно писать LEFT JOIN без LEFT OUTER JOIN.

А вот про "*= или =*" я ещё не слышал, пойду попробую.
Добавлено @ 15:07
Код
SELECT * FROM chat_user `c`, users `u` WHERE u.id =* c.id

Цитата
You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near '* c.id' at line 1

Так что в mYsql без join не обойтись!


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
ida
Дата 3.6.2004, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


замужем
****


Профиль
Группа: Завсегдатай
Сообщений: 2277
Регистрация: 14.5.2002
Где: Санкт-Петербург

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



Цитата(Secandr @ 3.6.2004, 11:26)
Смысл в том, что если есть фирма в company, но она ещё не выпустила не одного фильма её не покажут. Если использовать join, то её покажут с пустым списком фильмов.

Так мне и не нужно показывать фирмы, которые не выпустили ни одного фильма. Я же фильмы ищу, а не фирмы. Может это не совсем ясно было из постановки задачи - компании в данном случае играют роль атрибута фильма, нет фильма - нет и атрибута.

Это сообщение отредактировал(а) ida - 3.6.2004, 19:08
PM WWW   Вверх
Secandr
Дата 3.6.2004, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

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



ida Моё дело предупредить smile.gif


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




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


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

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