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:+---+----------+-----------+---
|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 | ...
+---+----------+-----------+---
To zapytanie ma jednakże sporo wad:
SELECT * FROM main AS m, options AS opt, options_types AS opt_t WHERE opt.owner = main.id AND opt_t.id = opt.OPTION;
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