Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]jak dzialaja relacje w bazie mysql
Forum PHP.pl > Forum > Przedszkole
michat34
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
nospor
O to pole:
kategoria_id
w tabeli ksiazki przechowuje info o kategori do której ksiązka nalezy. Czego tu nie rozumiesz?
sowiq
  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)
michat34
KEY to zwykły indeks?

nie rozumiem uzycia kropek w zapytaniu, głownie o nie mi chodzi
sowiq
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.
michat34
wielkie dzieki, teraz rozumiem.
mmmmmmm
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ć.
sowiq
@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ść
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).
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.