Mam BD w której mam 3 tabelę i chciałbym wyciągnąć z nich wszystkich dane w jednym zapytaniu Przypuśćmy, że mam BD w której trzymam informację o owocach. Mam 3 tabele owoce rosnące na drzewie, krzaku i w ziemi. W każdej tabeli znajduje się ID, Nazwa, Opis, Występowanie. i teraz chciałbym z tych wszytkich tabel wyciągnąć owoce które występuję w Polsce (WHERE występowanie = 'Polska') pomiędzy tymi tabelami nie ma być żadnych relacji dopiero z 4 tabelą gdzie mam fotki tych owoców chciałbym wyciągnąć zdjęciu dla wyciągniętych danych tutaj relacją wszystkich tych tabel do tej jednej jest ID). W przypadku wcyiągania danych z jednej tabeli i dołączenia zdjęć używam LEFT JOIN. Ale w przypadku wyciągnięcia danych ze wszystkich tabel już mi to nie działa.
- Rejestracja:ponad 9 lat
- Ostatnio:10 miesięcy
- Postów:1788
A zadałeś sobie pytanie po co mi trzy osobne tabele? :P To co zrobiłeś nazywa się Concrete Table Inheritance, ale nie ma najmniejszego sensu, jeżeli każdy z twoich owoców ma takie same atrybuty. Wtedy wystarczy coś typu:
CREATE TABLE fruits
(
fruit_id INT AUTO_INCREMENT PRIMARY KEY,
fruit_type_id INT NOT NULL
);
CREATE TABLE fruit_types
(
fruit_type_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50)
);
Jeżeli chcesz zachować obecną strukturę, to poczytaj o czymś, co się nazywa UNION.
SELECT *, 'na drzewie' as fruit_type FROM drzewo
UNION
SELECT *, 'z krzaka' as fruit_type FROM krzak
UNION
SELECT *, 'z zuenu' as fruit_type FROM ziemia
- Rejestracja:ponad 9 lat
- Ostatnio:10 miesięcy
- Postów:1788
W takim razie masz dwa wyjścia:
- jeżeli te tabele nie mają żadnych wspólnych atrybutów (czyli zostajemy przy Concrete Table Inheritance), to musisz użyć
UNION
(lub jak zauważył @PanczoUNION ALL
), - jeżeli mają niektóre atrybuty wspólne, to:
- wydzielasz tabelę główną
- przenosisz do niej wspólne atrybuty
- i tym samym dochodzisz do Class Table Inheritance.
CREATE TABLE fruits (
fruit_id INT AUTO_INCREMENT PRIMARY KEY,
occurence VARCHAR(50)
-- wspólne atrybuty
);
CREATE TABLE fruits_from_tree (
fruit_id INT NOT NULL,
-- atrybuty specyficzne dla owoców z drzewa
FOREIGN KEY (fruit_id) REFERENCES fruits (fruit_id)
);
CREATE TABLE fruits_from_ground (
fruit_id INT NOT NULL,
-- atrybuty specyficzne dla owoców z ziemi
FOREIGN KEY (fruit_id) REFERENCES fruits (fruit_id)
);
SELECT * FROM fruits f -- oczywiście * jest zła
JOIN fruits_from_tree fft ON f.fruit_id = fft.fruit_id
JOIN fruits_from_ground ffg ON f.fruit_id = ffg.fruit_id
WHERE f.occurence = 'Poland'
- Rejestracja:prawie 8 lat
- Ostatnio:prawie 4 lata
- Postów:11
Zrobiłem to w ten sposób i działa
SELECT id, tytul, wystepowanie FROM zdrzewa WHERE wystepowanie='Polska' UNION ALL SELECT id, tytul, wystepowanie FROM krzak WHERE wystepowanie='Polska' UNION ALL SELECT id, tytul, wystepowanie FROM zziemi WHERE wystepowanie='Polska'"
Ale chciałbym jeszcze dołączyć do tych zapytań żeby z 4 tabeli wyciągnięte zostało zdjęcie chciałem tutaj po każdym zapytaniu dodać left join ale wyskakuje mi błąd
zapytanie zrobiłem tak:
SELECT id, tytul, wystepowanie LEFT JOIN foto ON zdrzewa.id=foto.id FROM zdrzewa WHERE wystepowanie='Polska' UNION ALL. i dalej jak powyżej dodajać wszędzie left JOIN
No ale tutaj mi wyskakuje taki bład: expects parameter 1 to be mysqli_result, boolean given
chce zaznaczyć, że 3 tabale z 4 ( ze zdjęciami ) są połączone w relacji ID.

- Rejestracja:ponad 9 lat
- Ostatnio:11 miesięcy
- Postów:4700
LEFT JOIN robisz po FROM, po nazwie tabeli z którą chcesz zrobić złączenie.
UNION ALL