A. B. Dinshaa Ответов: 4

Кто-нибудь может написать следующие SQL-запросы?


1. List all the directors who directed a film in a leap year by using SELECT statement
2. Find the film(s) with the largest cast using SELECT statement)

	ACTOR (aid, fname, lname, gender)
	MOVIE (mid, name, year, rank)
	DIRECTOR (did, fname, lname)
	CAST (aid, mid, role)
	MOVIE_DIRECTOR (did, mid)

sql_create_ACTOR_table = """ CREATE TABLE IF NOT EXISTS ACTOR (
                                        aid integer PRIMARY KEY,
                                        fname text NOT NULL,
                                        lname text NOT NULL,
                                        gender text NOT NULL
                                        ); """

sql_create_MOVIE_table = """ CREATE TABLE IF NOT EXISTS MOVIE (
                                     mid integer PRIMARY KEY,
                                     name text NOT NULL,
                                     year integer NOT NULL,
                                     rank integer NOT NULL
                                     ); """

 sql_create_CAST_table = """ CREATE TABLE IF NOT EXISTS CAST (
                                    aid integer NOT NULL,
                                    mid integer NOT NULL,
                                    role text NOT NULL,
                                    FOREIGN KEY (aid) REFERENCES ACTOR (aid),
                                    FOREIGN KEY (mid) REFERENCES MOVIES (mid)
                                    ); """

sql_create_DIRECTOR_table = """ CREATE TABLE IF NOT EXISTS DIRECTOR (
                                        did integer PRIMARY KEY,
                                        fname text NOT NULL,
                                        lname text NOT NULL
                                        ); """

sql_create_MOVIE_DIRECTOR_table = """ CREATE TABLE IF NOT EXISTS MOVIE_DIRECTOR (
                                              did integer COMPOSITE KEY,
                                              mid integer COMPOSITE KEY
                                              ); """


Что я уже пробовал:

Я пытался сделать эти запросы, но они не дают никаких выходных данных на jupyter notebook.

Garth J Lancaster

Это похоже на домашнюю работу - мы не делаем домашнюю работу за людей. Вы говорите: "не давать никакого результата".. хорошо, почему бы вам не обновить свой вопрос (используйте "улучшить вопрос") с некоторыми образцами данных для каждой таблицы, а затем показать SQL - запросы, которые вы пробовали-таким образом, "мы", возможно, сможем вам помочь .. в противном случае, у нас есть только ваше слово, что вы пытались

4 Ответов

Рейтинг:
2

RickZeeland

Взгляните на это: Python MySQL[^] чтобы узнать, как создать базу данных, а затем создать таблицы.


Рейтинг:
1

CHill60

Элис Норман написала в комментарии:
Для #1: Выберите * от директора-где в
(Выберите did из MOVIE_DIRECTOR и MOVIE, где MOVIE.year/4 = 0)
Поскольку високосный год-это тот, который при делении на 4 результат равен 0
Неверно, что високосный год - это год, когда результат после деления на 4 равен 0 - вам нужно найти модуль деления года на 4, то есть остаток должен быть равен 0. Вы можете сделать это с помощью
WHERE MOVIE.year % 4 = 0
или
WHERE MOD(MOVIE.year, 4) = 0
Последнее является специфичным для MySQL. Я предпочитаю использовать%, так как он может быть использован на других платформах.

Это не то, как вы соединяете таблицы в MySql в соответствии с документацией по адресу MySQL :: MySQL 8.0 справочное руководство :: 13.2.10.2 предложение JOIN[^]. Возможно, вы имели в виду
SELECT * FROM DIRECTOR WHERE did IN 
(SELECT did FROM MOVIE_DIRECTOR INNER JOIN MOVIE ON MOVIE_DIRECTOR.mid = MOVIE.mid WHERE MOVIE.year % 4 = 0)
На самом деле в этом подзапросе нет никакой необходимости. Вы можете получить тот же эффект, просто используя соединения, подобные этому
SELECT * 
FROM DIRECTOR 
INNER JOIN MOVIE_DIRECTOR ON DIRECTOR.did = MOVIE_DIRECTOR.did
INNER JOIN MOVIE ON MOVIE_DIRECTOR.mid = MOVIE.mid 
WHERE MOVIE.year % 4 = 0
Наконец, с вашим ключом на столе MOVIE_DIRECTOR - лично я никогда не видел, чтобы это делалось таким образом. Я бы использовал
CREATE TABLE IF NOT EXISTS MOVIE_DIRECTOR (
did integer,
mid integer,                                         
PRIMARY KEY (mid, did));


Редактировать после ОП комментарии:
Элис Норман написала в комментарии:
а как насчет № 3? она такова: найдите всех актеров, которые снимались только в фильмах до 1960 года
так ли это?

Выберите имя актера, где год>1960

но таблица лет это кино не в актере
Эти вопросы все о том, чтобы сделать вас комфортно с таблицами присоединиться
Вы можете найти следующие ссылки полезными
Визуальное представление SQL-соединений[^]
Общие сведения о соединениях в SQL Server[^]

ОП тоже получаю сообщение об ошибке
Цитата:
IntegrityError: UNIQUE constraint failed: ACTOR.aid
Вы где-то добавили ограничение, что имена актеров или идентификаторы актеров должны быть уникальными. Вы уже ввели детали актера, и теперь вы пытаетесь ввести их снова.

Также смотрите комментарий @Richard-Deeming
Цитата:
Даже взятия модуля недостаточно для правильного определения високосного года:
и ссылка, которую он предоставил Високосный год - Википедия[^].На каком-то этапе вы, вероятно, захотите поместить это в пользовательскую функцию (или отфильтровать результаты в пользовательском интерфейсе). Вероятно достаточно просто использовать модуль 4 на этом этапе вашего обучения но не упускайте из виду эту неточность


Maciej Los

5ed!

Richard Deeming

Даже взятия модуля недостаточно для правильного определения високосного года:
Високосный год - Википедия[^]

A. B. Dinshaa

а как насчет № 3? она такова: найдите всех актеров, которые снимались только в фильмах до 1960 года
так ли это?

Выберите имя актера, где год>1960

но таблица лет это кино не в актере

A. B. Dinshaa

Ошибка ниже не уходит из последних двух-трех дней, и где же повторение?

---------------------------------------------------------------------------
IntegrityError обратная трассировка (самый недавний призыв последнего)
&ЛТ;оболочкой IPython-вход-4-c34c20bb3abd> В &ЛТ;модуль&ГТ;
483
484 если __name_ _ = = '__main__':
--> 485 главная()

<ipython-input-4-c34c20bb3abd> in main()
353 ACTOR_5 = (5, 'fname5', 'lname5', 'male')
354 # insert_ACTOR
--> 355 insert_ACTOR(conn, ACTOR_1)
356 insert_ACTOR(conn, ACTOR_2)
357 insert_ACTOR(conn, ACTOR_3)

<ipython-input-4-c34c20bb3abd> in insert_ACTOR(conn, ACTOR)
43 значения(?,?,?,?) "'
44 вал. = соед.курсор()
---> 45 cur.execute(sql, актер)
46 возвращение кур.lastrowid
47

IntegrityError: UNIQUE constraint failed: ACTOR.aid

CHill60

Я обновил свое решение

Рейтинг:
1

Haris Memon

import sqlite3 as sql

conn = sql.connect('test.db')
c = conn.cursor()


#1. List all the directors who directed a film in a leap year by using SELECT statement
for row in c.execute("""SELECT fname, m.year from director d
                    INNER JOIN movie_director md on md.did = d.did
                    INNER JOIN movie m on m.mid = md.mid
                    WHERE m.year % 4 = 0;
                    """):
    print(row)

#2. Find the film(s) with the largest cast using SELECT statement)
SELECT c.mid,  m.name, maxCast
from cast c,
(
	SELECT cc.mid, count(*) as maxCast
	from cast cc
	group by cc.mid
)
inner join movie m on m.mid = c.mid
where maxCast = 
(
	SELECT max(maxCast)
	from
	(
		select ccc.mid, count(*) as maxCast
		from cast ccc
		GROUP by ccc.mid
	)
)
group by maxCast


c.close()


Кроме того, у вас есть проблема в movie_director, которую вы написали неправильно (синтаксическая ошибка)


CHill60

Причины моего голосования 2:
- для #1 Вы, по сути, просто перепостили то, что было в решении 4
- для #2 SQL выдает синтаксические ошибки
- #2 также содержит повторение. Вместо того чтобы писать один и тот же запрос дважды рассмотрите возможность использования временных таблиц или общего табличного выражения например

;with cte AS
(
	select mid, COUNT(*) as CastCount FROM CAST GROUP BY mid
)
SELECT * FROM cte 
INNER JOIN MOVIE M ON cte.mid = M.mid
WHERE CastCount = (SELECT MAX(CastCount) FROM CTE)

- Ваш комментарий о "проблеме в movie_director" не совсем ясен. Однако это заставило меня проверить свое решение и исправить ошибку. Но опять же, проблема с этим определением таблицы уже была опубликована.

Рейтинг:
1

OriginalGriff

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

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