Problem z poleceniami w MySQL

0

Witajcie!

Mam następujące tabele w bazie danych:
aktorzy (id_aktora, imie, nazwisko)
filmy (id_filmu, tytul, rok_produkcji, cena)
klienci (id_klienta, imie, nazwisko)
kopie (id_kopii, id_filmu, czy_dostepna)
obsada (id_aktora, id_filmu)
wypozyczenia (id_klienta, id_kopii, data_wypozyczenia, data_zwrotu)

Potrzebuję napisać polecenia w MySQL realizujące zadania:

  1. Wyświetl tytuły filmów, wypożyczonych zarówno przez klienta o nazwisku 'Rubik' , jak i klienta o nazwisku 'Kostka'

Moje polecenie:
SELECT filmy.tytul FROM filmy
JOIN kopie ON filmy.id_filmu = kopie.id_filmu
JOIN wypozyczenia ON kopie.id_kopii = wypozyczenia.id_kopii JOIN klienci ON wypozyczenia.id_klienta = klienci.id_klienta WHERE nazwisko = 'Rubik' AND nazwisko = 'Kostka';

No i pojawił się problem, a mianowicie - pokazuje mi kolumnę 'tytul' ale pustą. A jest jeden film 'Terminator', który był wypożyczony przez obydwu panów.
Co jest źle z zapytaniem?
Proszę pomóżcie, bo nie mam pomysłu.

  1. Dla każdego aktora, który zagrał w co najmniej 2 filmach wyświetl jego imię, nazwisko oraz liczbę filmów, w których zagrał.

Wiem tylko, że trzeba połączyć "joinem" 2 tabele: aktorzy i obsada, ale jak napisać warunek wyszukujący ilość filmów, w których zagrali aktorzy?
Przeszukałam internet i nie znalazłam nic, co pomogłoby mi zrozumieć jak napisać warunek…

  1. Utwórz relację KSIAZKI o następującej strukturze:
    a. atrybut ID_KSIAZKI typu całkowitoliczbowego klucz podstawowy
    b. atrybut TYTUL typu łańcuch znakowy, maksymalnie 45 znaków, wartość obowiązkowa
    c. atrybut OCENA typu liczba rzeczywista, wartość z przedziału od 2 do 6

Moje polecenie:
CREATE TABLE ksiazki (id_ksiazki INT PRIMARY KEY, tytul VARCHAR(45) NOT NULL, ocena SET(2, 3, 4, 5, 6))
Czy dobrze jest to zapisanie? czy przy atrybucie ocena ten zapis jest poprawny?

Jestem dopiero na początku drogi z baz danych.
Bardzo dziękuję za każdą pomoc, podpowiedź, wskazówkę.

Pozdrawiam

0

ad.1

WHERE nazwisko = 'Rubik' OR nazwisko = 'Kostka'

ad.2
funkcja agregująca count( )

0
  1. Niestety ale z OR wyskakują mi wszystkie filmy wypożyczone przez obydwie osoby, a tu chodzi o wspólny zbiór. Ma odszukać tylko film wypożyczony zarówno przez jednego jak i drugiego pana/panią. I jest to film 'Terminator'.
    Polecenie dla zbioru wspólnego to INTERSECT ale w MySQL to nie działa.
    Użyte zostało też DISTINCT przez SELECT i też nic.
0

Pierwsze zadanie można rozwiązać na dwa sposoby:
1) sposób gorszy wydajnościowo, bardziej skomplikowany, ale łatwiejszy do zrozumienia przez początkujących.
Nie możesz wziąć nazwisko='Rubik' AND nazwisko='Kostka', ponieważ nie znajdziesz żadnego rekordu, który JEDNOCZEŚNIE ma nazwisko i 'Kostka', i "Rubik'.
Sposób z OR również da złe wyniki.
Trzeba to zrobić tak:
Trzeba dołączyć drugi raz tabelę z klientami i połączyć z powyższym zapytaniem (dla tego samego filmu) i jedną tabelę klientów przefiltrować po 'Rubik', a drugą po 'Kostka'
(jakbyś wrzucił dane na fiddla, to bym napisał SQL)

  1. W uproszczeniu trzeba przefiltrować tabelę po nazwisko IN ('Rubik', 'Kostka'), pogrupować po filmie i sprawdzić, gdzie ilość różnych nazwisk jest równa 2
0

Dziękuje za dotychczasową pomoc.

A czy zapytanie nr 3 - tworzące nową tabelę jest dobrze napisane?

0

Nie SET, a ENUM. SET dopuszcza wiele wartości ze zbioru. ENUM tylko jedną.
Jak dla mnie to jeszcze id_ksiazki powinno być auto_inrcement, a ocena NOT NULL, ale tego w zadaniu nie masz...

0

Niestety nie udało mi się wykonać zadania nr 1 wg wskazówek. Zaczynam wątpić w swojego umiejętności dotyczące baz danych i MySQLa. Zadanie to śni mi się już po nocach ...

0
Marcin.Miga napisał(a):

Pierwsze zadanie można rozwiązać na dwa sposoby:
1) sposób gorszy wydajnościowo, bardziej skomplikowany, ale łatwiejszy do zrozumienia przez początkujących.
Nie możesz wziąć nazwisko='Rubik' AND nazwisko='Kostka', ponieważ nie znajdziesz żadnego rekordu, który JEDNOCZEŚNIE ma nazwisko i 'Kostka', i "Rubik'.
Sposób z OR również da złe wyniki.
Trzeba to zrobić tak:
Trzeba dołączyć drugi raz tabelę z klientami i połączyć z powyższym zapytaniem (dla tego samego filmu) i jedną tabelę klientów przefiltrować po 'Rubik', a drugą po 'Kostka'
(jakbyś wrzucił dane na fiddla, to bym napisał SQL)

  1. W uproszczeniu trzeba przefiltrować tabelę po nazwisko IN ('Rubik', 'Kostka'), pogrupować po filmie i sprawdzić, gdzie ilość różnych nazwisk jest równa 2

Hej, możesz podesłać kod?

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0