Wyciąganie danych z kilku tabel [MYSQLi i PHP]

0

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.

1

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
0

Ja podałem jedynie przykład, w mojej bazie danych poszczególne tabele mają różne atrybuty.

2

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ł @Panczo UNION 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'
0

A tak w ogóle - dlaczego chcesz utworzyć takie zapytanie?

0

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.

1

LEFT JOIN robisz po FROM, po nazwie tabeli z którą chcesz zrobić złączenie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1