• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Relacyjna baza danych/join

VPS Starter Arubacloud
+1 głos
196 wizyt
pytanie zadane 5 czerwca 2018 w SQL, bazy danych przez Adrian Paź Obywatel (1,270 p.)

Witam! Mam 3 tabele:

czytelnicy (id_czytelnika, imie, nazwisko, login)

ksiazki(id_ksiazki, tytul, autor)

wypozyczenia(id_wypozycz, id_czytelnika, id_ksiazki)

Mam zapisane to w formie 

id_wypozycz INTEGER PRIMARY KEY AUTOINCREMENT,
id_czytelnika INTEGER,
id_ksiazki INTEGER,
FOREIGN KEY (id_czytelnika) REFERENCES czytelnicy(id_czytelnika),
FOREIGN KEY (id_ksiazki) REFERENCES ksiazki(id_ksiazki),

i teraz chciałbym w metodzie listaWypozyczen() wyswietlic imie i nazwisko i odpowiadaja mu ksiazka (tytul, autor)

Jak wykorzystać te całe klucze opcje i referencje? Lub to JOIN co widziałem? Jak to działa? Do służy do takich rzeczy właśnie? Pomóżcie bo z tych stron tutorialowych nie wiele rozumiem :/ 

Jak to zrobić? Wyswietlenie id ksiazki i czytelnika jest dla mnie bez sensu :/ 

3 odpowiedzi

+1 głos
odpowiedź 5 czerwca 2018 przez adas94 Nałogowiec (29,200 p.)
edycja 5 czerwca 2018 przez adas94
SELECT czytelnicy.imie, czytelnicy.nazwisko, ksiazki.tytul, ksiazki.autor FROM czytelnicy
JOIN wypozyczenia ON czytelnicy.id_czytelnika = wypozyczenia.id_czytelnika
JOIN ksiazki ON ksiazki.id_ksiazki = wypozyczenia.id_ksiazki

Po SELECT'ie listujesz jakiego typu dane chcesz zwrócić. Mają pattern np. czytelnicy.imie a nie samo imie po to, aby odróżnić kolumny różnych tabel(bo bierzemy dane z paru tabel).

Chcemy wziąć tytuł książki i autora z tabeli czytelnicy. No i jak to zrobić jak tego nie ma w tej tabeli, a jest tylko jakiś tam ID. No właśnie po to robimy te 2 JOINY, aby niejako złączyć wszystkie 3 tabele i mieć do nich dostęp. (Te Joiny to są takie sztywne połączenia. Te joiny zamieniają ci ten niewinny ID w czytelnicy na dostęp do wszystkich 3 tabel).

Od momentu zdefiniowania JOINÓW masz tak jakby turbo tabelę złożoną ze wszystkich połączonych tabel i możesz się odnosić do każdej kolumny każdej tabeli po słowach kluczowych jak SELECT, WHERE, ORDER BY itd. za pomocą patternu tabela.kolumna (przykład wykorzystania masz na samej górze)

 

 

komentarz 5 czerwca 2018 przez Adrian Paź Obywatel (1,270 p.)
Dziekuję bardzo! :D
+1 głos
odpowiedź 5 czerwca 2018 przez Catalonya1992 Mądrala (5,440 p.)
Na początek to co interesuje Cię najbardziej:

select c.imie, c.nazwisko, k.tytul, t.autor
from czytelnicy c
left join wypozyczenia w on c.id_czytlenika = w.id_czytelnika
left join ksiazki k on k.id_ksiazki = w.id_ksiazki;

select c.imie, c.nazwisko, k.tytul, t.autor - lista kolumn, które wybierasz, literki to tzw. aliasy, czyli skrócona nazwa tabeli

tutaj określasz kolumny, z których chcesz wybrać dane, w tym przypadku potrzebujemy wszystkich 3 kolumn, bo tabela książki nie jest bezpośrednio powiązana z tabelą czytelnicy.

from czytelnicy c
left join wypozyczenia w on c.id_czytlenika = w.id_czytelnika -- warunek po jakim łączysz tabele czytelnicy z tabelą wypożyczenia
left join ksiazki k on k.id_ksiazki = w.id_ksiazki; --warunek po jakim łączysz tabelę książki z tabelą wypożyczenia

Teraz tabele są powiązane,tzn. dane znajdują się w jednym rekordzie. Istnieje kilka rodzajów joinów. Temat zbyt złożony na jeden komentarz :) Prowadzę darmowy kurs programowania baz danych, jeśli chcesz to nagram w tym miesiącu odcinek o złączeniach.

https://www.youtube.com/watch?v=H32Y48Rxq9c&index=4&list=PL8g9gILZp1OJpjlu7AuR9Ysu4z5Rff_AQ

Pozdrawiam.
komentarz 5 czerwca 2018 przez Adrian Paź Obywatel (1,270 p.)
Bardzo chce! ♥ Dziękuję za ten i jak i za wszystkie wasze komentarze :) zabieram sie do roboty! Każdą praktycznie rzecz wyjaśniłeś :D
komentarz 5 czerwca 2018 przez Adrian Paź Obywatel (1,270 p.)

@Catalonya1992, @adas94 Hmmm dlaczego wyświetla mi to tak:

http://prntscr.com/jr5xyc

mimo, że tabela wypożyczeń nie powinna być pusta (zainicjowałem już wypożyczenia przedtem) no i jak mogę zrobić tak żeby wyświetlało mi nie wszystkich tylko tych co mają wypożyczone książki :/ Biblioteka może mieć kilkaset czytelników a nie każdy ma coś wypożyczonego :/ Coś z klauzulą where ale jak ją tu włożyć jak to już z joinami jest skomplikowane :D Normalnie problemu by nie było ale w tej super tabeli hmmmm

P.S doałem już prepareStatement.execute(); do metody dodajWypozyczenia() co i tak nic nie zmienia xD

komentarz 5 czerwca 2018 przez Catalonya1992 Mądrala (5,440 p.)
Nie widze podglądu zdjęcia, jeśli chcesz widzieć tylko wyniki osób które coś wypożyczyły to zastąp w zapytaniu left join na inner join.
Dobra, kolejne odcinki nagram o kluczach. Zrozumienie tego tematu pozwoli Ci szybciej zrozumieć joiny.
komentarz 5 czerwca 2018 przez Adrian Paź Obywatel (1,270 p.)

Moja metoda wygląda tak: 

public void wyswietlWypozyczenia()
	{
		boolean wypozyczenia = false;
		try
		{
			ResultSet resultSet = statement
					.executeQuery("SELECT czytelnicy.imie, czytelnicy.nazwisko, ksiazki.tytul, ksiazki.autor"
							+ " FROM  czytelnicy left join wypozyczenia "
							+ "on czytelnicy.id_czytelnika = wypozyczenia.id_czytelnika left join ksiazki on ksiazki.id_ksiazki = wypozyczenia.id_ksiazki");
			while (resultSet.next())
			{
				System.out.println(resultSet.getString("imie") + " " + resultSet.getString("nazwisko") + " - "
						+ resultSet.getString("tytul") + " , " + resultSet.getString("autor"));
				System.out.println();
				wypozyczenia = true;
			}
			resultSet.close();
			if (!wypozyczenia)
			{
				System.out.println("Nie znaleziono wypożyczeń !\n");
			}
		} catch (SQLException e)
		{
			System.out.println(e);
		}
	}

a wyświetlają mi się wszyscy czytelnicy z bazy w postaci np Jan Kowalski - null , null

komentarz 5 czerwca 2018 przez Adrian Paź Obywatel (1,270 p.)
Musze chyba lepiej zrozumieć jak to działa, bo (MAGIA) zamiana słowa "left" na  "inner" zadziałała :D ale teraz nie wyświetla nic :/ tylko komunikat że nie znaleziono wypożyczeń albo coś skopałem musze w tej metodzie uda Ci się zobaczyć albo potrzzebny jest gdzieś jakiś warunek :D Co do filmów to stanowczo rób :D właśnie oglądam i się udukuję xD
0 głosów
odpowiedź 5 czerwca 2018 przez plucins Stary wyjadacz (11,110 p.)
SELECT czytelnicy.imie, czytelnicy.nazwisko from czytelnicy left outer join wypozyczenia on czytelnicy.id_czytelnika = wypozyczenia.id_czytelnika left outer join ksiazki on wypozyczenia.id_ksiazki = ksiazki.id_ksiazki;

Nie obiecuje, że to działa bo pisałem bez testowania ale coś w ten deseń. Tak dla podpowiedzi nazwy tabel powinny być w liczbie pojedynczej ;)

Podobne pytania

0 głosów
0 odpowiedzi 162 wizyt
pytanie zadane 16 września 2023 w SQL, bazy danych przez martinez369 Początkujący (460 p.)
0 głosów
1 odpowiedź 138 wizyt
pytanie zadane 6 czerwca 2018 w SQL, bazy danych przez Adrian Paź Obywatel (1,270 p.)
0 głosów
0 odpowiedzi 243 wizyt

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...