Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]jak dzialaja relacje w bazie mysql
michat34
post
Post #1





Grupa: Zarejestrowani
Postów: 200
Pomógł: 1
Dołączył: 4.08.2012

Ostrzeżenie: (10%)
X----


witam, na wikibooks czytam kurs o relacjach i jest taki przykład

  1. CREATE TABLE `kategorie` (
  2. `id` mediumint(9) NOT NULL AUTO_INCREMENT,
  3. `nazwa` VARCHAR(40) NOT NULL,
  4. `il_ksiazek` mediumint(9) DEFAULT NULL,
  5. PRIMARY KEY (`id`),
  6. KEY `il_ksiazek` (`il_ksiazek`)
  7. ) ENGINE=InnoDB;
  8.  
  9. INSERT INTO `kategorie` VALUES (1, 'Literatura polska', 4);
  10. INSERT INTO `kategorie` VALUES (2, 'Literatura zagraniczna', 2);
  11.  
  12. CREATE TABLE `ksiazki` (
  13. `id` INT(11) NOT NULL AUTO_INCREMENT,
  14. `nazwa` VARCHAR(100) NOT NULL,
  15. `wydawnictwo` VARCHAR(50) NOT NULL,
  16. `cena` FLOAT NOT NULL DEFAULT '0',
  17. `kategoria_id` mediumint(9) NOT NULL,
  18. PRIMARY KEY (`id`),
  19. KEY `kategoria_id` (`kategoria_id`)
  20. ) ENGINE=InnoDB;
  21.  
  22. INSERT INTO `ksiazki` VALUES (1, 'Hamlet', 'AAA', 6.5, 2);
  23. INSERT INTO `ksiazki` VALUES (2, 'Makbet', 'AAA', 6.8, 2);
  24. INSERT INTO `ksiazki` VALUES (3, 'Potop', 'BBB', 18.4, 1);
  25. INSERT INTO `ksiazki` VALUES (4, 'Quo vadis', 'BBB', 17.99, 1);
  26. INSERT INTO `ksiazki` VALUES (5, 'Pan Tadeusz', 'CCC', 13.78, 1);
  27. INSERT INTO `ksiazki` VALUES (6, 'Nad Niemnem', 'CCC', 15.45, 1);


"Przy każdym rekordzie w tabeli ksiazki pole kategoria_id przechowuje numeryczny ID rekordu kategorii, do którego dana książka jest przypisana."

po wpisaniu
SELECT kategorie.nazwa FROM ksiazki, kategorie WHERE kategorie.id = ksiazki.kategoria_id
AND ksiazki.id = 3;

pojawia sie

+-------------------+
| nazwa------------|
+-------------------+
| Literatura polska |
+-------------------+
1 row in set (0.02 sec)

czy moglibyscie mi wytłumaczyc w ktorym miejscu kategoria_id przechowuje numeryczny ID rekordu kategorii? czy chodzi o PRIMARY KEY (id)? jesli tak to skad wiadomo ze chodzi o id kategorii a nie id rekordu ksiazki? a takze wyjasnic dlaczego w zapytaniu wystepuje ta kropka? po prostu prosiłbym o wytłuamczenie mi podstaw działania relacji bo przeczytalem dwa kursy i nie do konca to rozumiem

Ten post edytował michat34 5.10.2012, 15:57:33
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




O to pole:
kategoria_id
w tabeli ksiazki przechowuje info o kategori do której ksiązka nalezy. Czego tu nie rozumiesz?
Go to the top of the page
+Quote Post
sowiq
post
Post #3





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


  1. SELECT kategorie.nazwa FROM ksiazki, kategorie WHERE kategorie.id = ksiazki.kategoria_id AND ksiazki.id = 3;

Kolego, radzę znaleźć jakiś lepszy (nowszy) kurs. Do tego typu zapytań stosuje się od bardzo dawna konstrukcję JOIN, a nie iloraz kartezjański (FROM ksiazki, kategorie)

Ten post edytował sowiq 5.10.2012, 15:59:01
Go to the top of the page
+Quote Post
michat34
post
Post #4





Grupa: Zarejestrowani
Postów: 200
Pomógł: 1
Dołączył: 4.08.2012

Ostrzeżenie: (10%)
X----


KEY to zwykły indeks?

nie rozumiem uzycia kropek w zapytaniu, głownie o nie mi chodzi
Go to the top of the page
+Quote Post
sowiq
post
Post #5





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat(michat34 @ 5.10.2012, 16:59:29 ) *
nie rozumiem uzycia kropek w zapytaniu, głownie o nie mi chodzi


Po pierwsze nie napisałeś, że o to Ci chodzi. Po drugie to na tyle oczywiste, że jakbyś się przez kilka sekund zastanowił, to sam byś do tego doszedł.

Kropką rozdzielana jest nazwa tabeli i nazwa kolumny. Jeśli robisz zapytanie z jednej tabelki, to wystarczy podawać nazwy kolumn. Ale jeśli (jak w Twoim przykładzie) wykonujesz zapytanie pobierające dane z kilku tabel, to przed nazwami kolumn dodaje się nazwy tabel, np.: tabela1.kolumna_x, tabela7.kolumna_56. Dodawanie nazwy tabeli jest w MySQL wymagane tylko jeśli w co najmniej dwóch tabelach, o które pytasz w zapytaniu, istnieją tak samo nazwane kolumny, o które pytasz.

Ten post edytował sowiq 5.10.2012, 16:07:15
Go to the top of the page
+Quote Post
michat34
post
Post #6





Grupa: Zarejestrowani
Postów: 200
Pomógł: 1
Dołączył: 4.08.2012

Ostrzeżenie: (10%)
X----


wielkie dzieki, teraz rozumiem.
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #7





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


Ech, sowiq
Cytat(sowiq @ 5.10.2012, 17:05:05 ) *
Dodawanie nazwy tabeli jest w MySQL wymagane tylko jeśli w co najmniej dwóch tabelach, o które pytasz w zapytaniu, istnieją tak samo nazwane kolumny, o które pytasz.

Nieprawda.
Nie zawsze jest wymagane. Należy podać (jeśli są takie same pola) przy: łączeniu (JOIN), warunkach (WHERE), sortowaniu (ORDER BY) i grupowaniu(GROUP BY).
Przy zwykłym SELECT nie musi być... Problemy jakie z tego wynikną - cóż, takie same, jakby były prefiksowane nazwą tabeli... Znacznie lepiej takie pola dodatkowo aliasować.
Go to the top of the page
+Quote Post
sowiq
post
Post #8





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


@mmmmmmm, może nie wyraziłem się zbyt jasno.
Cytat
istnieją tak samo nazwane kolumny, o które pytasz.

Miałem przez to na myśli jawne umieszczenie ich nazw w zapytaniu, czyli dokładnie to, co napisałeś.
Go to the top of the page
+Quote Post
-Gość-
post
Post #9





Goście







Cytat(sowiq @ 5.10.2012, 15:58:48 ) *
  1. SELECT kategorie.nazwa FROM ksiazki, kategorie WHERE kategorie.id = ksiazki.kategoria_id AND ksiazki.id = 3;

Kolego, radzę znaleźć jakiś lepszy (nowszy) kurs. Do tego typu zapytań stosuje się od bardzo dawna konstrukcję JOIN, a nie iloraz kartezjański (FROM ksiazki, kategorie)


@sowiq Nie wiem czy nie widzisz, ale to nie jest iloczyn kartezjański, w warunku WHERE jest warunek złączenia tabel, a poniższe zapytania są równoważne:
  1. SELECT kategorie.nazwa FROM ksiazki, kategorie WHERE kategorie.id = ksiazki.kategoria_id

  1. SELECT kategorie.nazwa FROM ksiazki JOIN kategorie ON kategorie.id = ksiazki.kategoria_id


Z dokumentacji MySQL podają również bardziej rozbudowany przykład:
Cytat
This is a conservative extension if we consider each comma in a list of table_reference items as equivalent to an inner join. For example:

SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)

is equivalent to:

SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)

In MySQL, JOIN, CROSS JOIN, and INNER JOIN are syntactic equivalents (they can replace each other).
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 08:50