Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyświetlenie danych z dwóch tabel z relacją
Forum PHP.pl > Forum > Bazy danych > MySQL
tomeklogin
Poniżej umieszczam strukturę tabel:

  1. CREATE TABLE rodzic(
  2. i INT UNSIGNED AUTO_INCREMENT,
  3. nazwa VARCHAR(40) NOT NULL,
  4. PRIMARY KEY (i),
  5. INDEX (nazwa)) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci
  6.  
  7. CREATE TABLE dziecko(
  8. od TINYINT(80) UNSIGNED NOT NULL,
  9. d0 INT UNSIGNED,
  10. d1 INT UNSIGNED,
  11. imie VARCHAR(80) NOT NULL,
  12. FOREIGN KEY (d0) REFERENCES rodzic(i) ON DELETE SET NULL ON UPDATE NO ACTION,
  13. FOREIGN KEY (d1) REFERENCES rodzic(i) ON DELETE SET NULL ON UPDATE NO ACTION,
  14. PRIMARY KEY (imie)) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci

Jak najefektywniej pobrać rodzica o danej nazwie oraz nazwy jego dzieci?
Najprościej można to zrobić 3 SELECT-ami, ale czy można jednym selectem te dane wydostać.
Czy będzie to bardziej efektywne?

Czekam na wasze roziwązania.
zzeus
Spróbuj coś takiego:

  1. SELECT i, nazwa, GROUP_CONCAT(imie) AS dzieci
  2. FROM rodzic AS a
  3. LEFT JOIN dziecko AS b ON a.i = b.d0
  4. GROUP BY i
tomeklogin
Zrobiłem co takiego:
  1. SELECT R.nazwa FROM rodzic R, dziecko D WHERE (R.i=D.d0 OR R.i=D.d1) AND D.imie='Jan'


Wyświetla mi dane obu rodziców. Czy to zapytanie jest efektywne?
Dlaczego na podobnej tabli tylko, że pola R.i oraz D.d0, D.d1 są tekstowe, zapytanie to nie działa?
zzeus
  1. EXPLAIN SELECT R.nazwa FROM rodzic R, dziecko D WHERE (R.i=D.d0 OR R.i=D.d1) AND D.imie='Jan'


dostaniesz w odpowiedzi wszystkie informacje o tym czy zapytanie jest optymalne czy można je poprawić
tomeklogin
Dzięki. Przyda się.
Drugie zapytanie, które zwraca wszystko w jednym rekordzie.

  1. SELECT dz.imie, r1.nazwa, r2.nazwa FROM dziecko AS dz, rodzic AS r1, rodzic AS r2 WHERE dz.imie = 'Jan' AND (r1.i = dz.d0 AND r2.i = dz.d1)


Które działa szybciej?
zzeus
Tak jak mówiłem wcześniej, masz EXPLAIN, uzupełnij tabele danymi i porównaj wyniki dla obu zapytań
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.