Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2013, 04:50   #1
SonicBob
Форумчанин
 
Регистрация: 30.05.2011
Сообщений: 133
По умолчанию Не работают запросы mySQL

По заданию создал бд и написал к ней запросы но некоторые не работаею как надо

Код:
#############

SELECT filmname.filmname, name.fullname

FROM film_akter

JOIN filmname ON film_akter.filmname = filmname.id
JOIN name ON film_akter.akter = name.id

WHERE film_akter.filmname = 'filmname3''

##################

SELECT * 
FROM film_akter


JOIN name ON film_akter.akter = name.id

WHERE akter = 'name4'
эти 2 выдают пустой результат хотя должны выдать пару строк выборки

а вот
Код:
SELECT film_akter.filmname AS filmname, film_akter.akter AS akter, 1 AS akter, 0 AS regiser, filmname.filmname, name.fullname 

FROM film_akter 
JOIN name ON film_akter.akter = name.id
JOIN filmname ON film_akter.filmname = filmname.id

UNION

SELECT film_regiser.filmname AS filmname, film_regiser.regiser AS regiser, 0 AS akter, 1 AS regiser, filmname.filmname, name.fullname 

FROM film_regiser 
JOIN name ON film_regiser.regiser = name.id
JOIN filmname ON film_regiser.filmname = filmname.id
по задумке должен был вернуть таблицу из 3 столбцов
название фильма, актер, режисер и подхватить значение из других таблиц а у меня вернул 6 столбцов 4 с цифрами и 2 со значениями
покажите как должно быть
прикрепил саму бд
Вложения
Тип файла: txt bd.txt (4.5 Кб, 154 просмотров)
SonicBob вне форума Ответить с цитированием
Старый 17.07.2013, 08:12   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
должны выдать пару строк выборки
Эксперимента ради напиши LEFT JOIN, и посмотришь какое присоединение будет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.07.2013, 08:31   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Код:
...
JOIN filmname ON film_akter.filmname = filmname.id
...
WHERE film_akter.filmname = 'filmname3''

...
JOIN name ON film_akter.akter = name.id
WHERE akter = 'name4'
меня терзают смутные сомнения.
Если Вы связываете таблицы по ID (кстати, рекомендую так проектировать таблицу, чтобы по имени поля сразу было понятно, что поле akter и filmname - это ИДЕНТИФИКАТОРЫ (ссылки на ключевые поля), тогда почему Вы их значение сопоставляете
искомому тексту?!! Или у Вас ключевые поля текстовые и имеют такие значения?!
Всё равно, бессмыслено делать выборку по таким параметрам!

короче.
1-е. давайте структуру таблиц.
2-е. покажите пример заполнения таблиц
тогда будет о чём говорить

Последний раз редактировалось Serge_Bliznykov; 17.07.2013 в 08:33.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.07.2013, 08:39   #4
SonicBob
Форумчанин
 
Регистрация: 30.05.2011
Сообщений: 133
По умолчанию

Код:
#/создание таблиц*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/

create table strana
(
id int PRIMARY KEY AUTO_INCREMENT,
strananame varchar(255) not null, 
unique(strananame));

create table gener
(
id int PRIMARY KEY AUTO_INCREMENT,
ganername varchar(255) not null, 
unique(ganername));

create table gender(
id int PRIMARY KEY AUTO_INCREMENT,
gender varchar(10) not null, 
unique(gender));
    
create table name(
id int PRIMARY KEY AUTO_INCREMENT,
fullname varchar(255) not null, 
gender int,
strana int,
foreign key (gender) references gender(id),
foreign key (strana) references strana(id), 
unique(fullname));

create table filmname(
id int PRIMARY KEY AUTO_INCREMENT,
filmname varchar(255) not null
god year,
strana int,
foreign key (strana) references strana(id)
gener int,
foreign key (gener) references gener(id),
unique(filmname)  
);

create table film_akter(
id int PRIMARY KEY AUTO_INCREMENT,
filmname int,
akter int,
foreign key (filmname)references filmname(id),
foreign key (akter) references name(id),
);

create table film_regiser(
id int PRIMARY KEY AUTO_INCREMENT,
filmname int,
regiser int,
foreign key (filmname)references filmname(id),
foreign key (regiser) references name(id)
);
#/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/

#/заполнение/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
INSERT INTO strana (strananame) VALUES
    ('USA'),#1
    ('Russia'),#2
('India'),#3
('England'),#4
('Canada'),#5
('China'),#6
('France'),#7
('Australia'),#8
('Cuba'),#9
('Germany');#10


INSERT INTO gener (ganername) VALUES
    ('ACTION'),#1
('WESTERN'),#2
('MYSTERY'),#3
('COMEDY'),#4
('ROMANCE'),#5
('THRILLER'),#6
('HORROR'),#7
('FANTASY'),#8
('HISTORY'),#9
('DRAMA');#10


INSERT INTO gender (gandername) VALUES
    ('male'),#1
    ('female');#2

incert into name(fullname,gender,strana) values
('name1',1,1),
('name2',2,2),
('name3',1,3),
('name4',2,4),
('name5',1,5),
('name6',2,6),
('name7',1,7),
('name8',2,8),
('name9',1,9),
('name10',2,10);

insert into filmname(filmname, god, strana,gener) values
('filmname1', 2001, 1,1),
('filmname2', 2002, 2,2),
('filmname3', 2003, 3,3),
('filmname4', 2004, 4,4),
('filmname5', 2005, 5,5),
('filmname6', 2006, 6,6),
('filmname7', 2007, 7,7),
('filmname8', 2008, 8,8),
('filmname9', 2009, 9,9),
('filmname10', 2010, 10,10);

insert into film_regiser(filmname , regiser) values
(1,1),
(2,6),
(3,4),
(4,4),
(5,6),
(6,3),
(7,6),
(8,1),
(9,1),
(10,3);


incert into film_akter(filmname , akter) values
(1,3),
(1,2),
(2,4),
(2,1),
(3,2),
(3,6),
(4,7),
(4,2),
(5,7),
(5,4),
(6,9),
(6,3),
(7,10),
(7,5),
(8,9),
(8,7)
(9,10),
(9,1),
(10,5),
(10,9);
#/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/
вот код на создание и заполнение как он есть щас у меня
SonicBob вне форума Ответить с цитированием
Старый 17.07.2013, 08:58   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

во-первых, крайне не рекомендую использовать ключевые слова в качестве имён таблиц или полей. (например, таблица name может обеспечить глюки).

во-вторых, я бы поля для связи (foreign key) всё же не называл так, как это делаете вы. Добавьте в имя поля постфикс _id для определённости.
Ибо проблема, которая у Вас возникла - это потому как Вы уже сами запутались, где у Вас id, а где наименование фильма!
например, так:
Код:
create table film_akter(
id int PRIMARY KEY AUTO_INCREMENT,
filmname int,
akter int,
foreign key (filmname_id)references filmname(id),
foreign key (akter_id) references name(id),
);
да и вообще, зачем использовать одно и то же наименование и для таблицы, и для поля в этой таблице, и для связи с этой таблицей, Вам что, фантазии не хватает, разные (причём более информативные == "говорящие") имена ?!


в-третьих, в первых двух запросах ваша ошибка в том, что Вы из-за одинаковых названий запутались, где же собственно название фильма (имя актёра).
попробуйте так изменить свои первые запросы:
Код:
SELECT filmname.filmname, name.fullname
FROM film_akter
JOIN filmname ON film_akter.filmname = filmname.id
JOIN name ON film_akter.akter = name.id
WHERE filmname.filmname = 'filmname3''

Код:
SELECT * 
FROM film_akter
JOIN name ON film_akter.akter = name.id
WHERE name.fullname = 'name4'

Последний раз редактировалось Serge_Bliznykov; 17.07.2013 в 09:03.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.07.2013, 09:24   #6
SonicBob
Форумчанин
 
Регистрация: 30.05.2011
Сообщений: 133
По умолчанию

Serge_Bliznykov, делал по примеру который получил в институте, с тем как связывать правильно до сих пор не разобрался полностью, в следующий раз буду давать разные названия, мб будет проще =)
а с 3м запросом как бороться?
SonicBob вне форума Ответить с цитированием
Старый 17.07.2013, 09:44   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

А что Вы хотите получить третьим запросом?!
Дело в том, что у Вас фильм с актёрами (и с режиссёрами) связан один ко многим (это, по сути верно - ведь в фильме снимается не один актёр и режиссёров тоже может быть больше одного).
Поэтому вопрос, что должен вернуть ваш запрос (по условиям задачи, что Вы от него ожидаете)?!

ну, допустим, возьмём фильм, который называется 'filmname1'
согласно вашим данным, в нём снялись два актёра: 'name3' и 'name2'
Какие строчки Вы ожидаете увидеть?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.07.2013, 10:00   #8
SonicBob
Форумчанин
 
Регистрация: 30.05.2011
Сообщений: 133
По умолчанию

Выбрать всех людей с флагами актер и режиссер
я ожидал увидеть таблицу из 3 колонок
1) название фильма
2) имя актера
3) имя режиссера
у меня там должно было получится на одно название фильма - 3 строки (2 актера и 1 режиссер)

а получил
filmname akter akter regiser filmname fullname
В первых 2х идет указатель на другую таблицу, что б подхватить реальные названия, а не цифры-указатели. В 3й и 4й идет флаг, а в 5 и 6 как раз подхватились реальные значения которые должны были записаться в столбцы 1 и 2
SonicBob вне форума Ответить с цитированием
Старый 17.07.2013, 11:54   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

так, что ли?
Код:
SELECT filmname.filmname as NazvanieFilma,
       name.fullname as ImayActera,
       ' ' as ImayRegisera
FROM film_akter 
JOIN name ON film_akter.akter = name.id
JOIN filmname ON film_akter.filmname = filmname.id

UNION ALL

SELECT filmname.filmname as NazvanieFilma,
    ' ' as ImayActera,
    name.fullname as ImayRegisera
FROM film_regiser 
JOIN name ON film_regiser.regiser = name.id
JOIN filmname ON film_regiser.filmname = filmname.id
кавычки в mySQL может быть потребуются двойные...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.07.2013, 12:35   #10
SonicBob
Форумчанин
 
Регистрация: 30.05.2011
Сообщений: 133
По умолчанию

да точно то что я хотел, спасибо!
SonicBob вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MySQL - Объединить запросы Dexes SQL, базы данных 4 19.08.2014 16:47
MYSQL + delphi (запросы) Devolarium БД в Delphi 23 25.12.2012 22:46
не работают запросы к БД fifa068 Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 0 21.12.2012 22:18
Динамические запросы в MySQL kuzjma SQL, базы данных 0 09.12.2011 13:58
Mysql запросы Lerank Помощь студентам 1 22.11.2010 18:00