Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobieranie danych rekurencyjnie z trzech tabel
Forum PHP.pl > Forum > Bazy danych > MySQL
L_Devil
Witam, mam trzy tabele:

Kod
main:
+---+----------+-----------+---
|id |   name   |   value   | ...
+---+----------+-----------+---
| 1 |  item1   |  value1   | ...
| 2 |  item2   |  value2   | ...
| 3 |  item3   |  value3   | ...
| 4 |  item4   |  value4   | ...
+---+----------+-----------+---

options:
+---+----------+-----------+---
|id |  owner   |   option  | ...
+---+----------+-----------+---
| 1 |     1    |     1     | ...
| 2 |     1    |     2     | ...
| 3 |     2    |     1     | ...
| 4 |     3    |     3     | ...
+---+----------+-----------+---

options_types:
+---+----------+-----------+---
|id |   nameX  |   valueX  | ...
+---+----------+-----------+---
| 1 |   opt1   |    val1   | ...
| 2 |   opt2   |    val2   | ...
| 3 |   opt3   |    val3   | ...
+---+----------+-----------+---
I teraz chciałbym, za pomocą jednego zapytania, wybrać wszystkie dane z tabeli main, tak, by do każdego id wybrać wszystkie dane z tabeli options o takim samym owner i przy okazji wszystkie pola z options_types, które mają id równe polu option z tabeli options. Żeby nie być gołosłownym, skonstruowałem własne zapytanie:
  1. SELECT * FROM main AS m, options AS opt, options_types AS opt_t
  2. WHERE opt.owner = main.id AND opt_t.id = opt.OPTION;
To zapytanie ma jednakże sporo wad:
1.) Zignoruje rekordy z tabeli main, które nie mają odpowiednika w tabeli options (a są takie)
2.) Jeżeli jednemu rekordowi z tabeli main przypada więcej niż jeden rekord w tabeli options, zostanie wybrany tylko pierwszy - pozostałe zostaną zignorowane

każdy rekord z tabeli options ma dokładnie jeden odpowiadający mu rekord z tabeli options_types. Jeden rekord z tabeli main ma dowolną ilość (także zero), odpowiadających mu rekordów z tabeli options.

Jak wybrać wszystkie te dane i zapisać w tablicy wielowymiarowej za jednym zamachem?

MySQL 4.0
koobs
sprobuj:
  1. SELECT m.*, o.*, t.*
  2. FROM main m
  3. LEFT JOIN OPTION o ON o.owner = m.id
  4. LEFT JOIN option_types t ON t.id = o.OPTION
L_Devil
Koobs, niech ci bóg w dzieciach wynagrodzi biggrin.gif O to mi dokładnie chodziło winksmiley.jpg Dzięki za zainteresowanie!
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.