Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wyświetlenie danych z dwóch tabel z relacją, Dwie proste tabele połączone relacją
tomeklogin
post
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 25.08.2009

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


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.

Ten post edytował tomeklogin 26.08.2009, 08:53:49
Go to the top of the page
+Quote Post
zzeus
post
Post #2





Grupa: Zarejestrowani
Postów: 441
Pomógł: 71
Dołączył: 3.09.2007
Skąd: wrocław

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


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


--------------------
Go to the top of the page
+Quote Post
tomeklogin
post
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 25.08.2009

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


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?
Go to the top of the page
+Quote Post
zzeus
post
Post #4





Grupa: Zarejestrowani
Postów: 441
Pomógł: 71
Dołączył: 3.09.2007
Skąd: wrocław

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


  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ć


--------------------
Go to the top of the page
+Quote Post
tomeklogin
post
Post #5





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 25.08.2009

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


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?

Ten post edytował tomeklogin 26.08.2009, 10:30:04
Go to the top of the page
+Quote Post
zzeus
post
Post #6





Grupa: Zarejestrowani
Postów: 441
Pomógł: 71
Dołączył: 3.09.2007
Skąd: wrocław

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


Tak jak mówiłem wcześniej, masz EXPLAIN, uzupełnij tabele danymi i porównaj wyniki dla obu zapytań


--------------------
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 21.08.2025 - 01:10