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

Wyciąganie danych z kilku tabel [MYSQLi i PHP]
V8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 11
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.

DE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1788
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:

Kopiuj
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.

Kopiuj
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
V8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 11
0

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

DE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1788
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.
Kopiuj
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'
axelbest
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 2255
0

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

V8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 11
0

Zrobiłem to w ten sposób i działa

Kopiuj
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:

Kopiuj

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.

Haskell
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4700
1

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.