Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: jak wyświetlić rekordy z kilku tabel
Forum PHP.pl > Forum > Bazy danych > MySQL
raczkowski1
Witam

Chciałbym wyświetlić wszystkie rekordy z kilku tabel teoretycznie niepowiązanych ze sobą.

Jeden sposób mam ale chyba nie najlepszy:

  1. (SELECT `id`, `complaint_id`, `user_id`, `date_create`, `print`, `type`, `path_img` FROM `mod_serwis_info_attach`)
  2. UNION
  3. (SELECT `id`, `complaint_id`, `user_id`, `date_create`, `print`, `type`, 'null' AS `path_img` FROM `mod_serwis_info_cal`)


Tabele mają tylko kilka pól takich samych a reszta jest jest specyficzna dla tabeli.

Jeśli nie ma jakiegoś sensownego zapytania sql to będę musiał zrobić z tych tabel jedną.

Cel jaki chcę osiągnąć to wyświetlić dane z kilku tabel w porządku chronologicznym wg kolumny date_create. Mogę pobrać każdą tabelę osobno i złączyć w jedną tabele za pomocą funkcji php array_merge, ale jak posortować wg daty?

Z góry dzięki za pomoc

Pozdrawiam
mortus
Jeśli tabele nie są ze sobą logicznie powiązane, tzn. nie mają wspólnej kolumny-klucza, to wybrałeś jedyny słuszny sposób. Wystarczy tylko dodać pseudokolumne, która będzie zawierać informacje, z której tabeli pochodzi rekord (oczywiście, jeżeli taka informacja jest Ci potrzebna) oraz sortowanie:
  1. (SELECT `id`, `complaint_id`, `user_id`, `date_create`, `print`, `type`, `path_img`, 'mod_serwis_info_attach' AS `table_name` FROM `mod_serwis_info_attach`)
  2. UNION
  3. (SELECT `id`, `complaint_id`, `user_id`, `date_create`, `print`, `type`, 'null' AS `path_img`, 'mod_serwis_info_cal' AS `table_name` FROM `mod_serwis_info_cal`)
  4. ORDER BY `date_create` [DESC | ASC]
raczkowski1
Zrobiłem sobie z tego widok, tylko pytanie czy to nie jest mało wydajne?
zaajcu
widoki zostały po to zrobione żeby przyśpieszać zapytania. Możesz sobie to sprawdzić wykonaj zapytanie którym tworzysz widok w phpMyAdmin i zobacz jaki będziesz miał czas wykonania potem zrób select * from widok i porównaj sobie czasy
viking
@zaajcu. Mylisz się. Widoki powstały po to żeby nie musieć klepać skomplikowanych zapytań i ewentualnie ograniczyć dostęp do danych. To coś w rodzaju aliasu dla zapytania. Co innego widok zmaterializowany ale w mysql nie występuje.
raczkowski1
Widoki tak jak napisał viking widoki mają ułatwić operacje na wielu tabelach, szczególne chyba selecty.
A ja pytając o wydajność chodziło mi o UNION bo gdzieś w necie widziałem informację, że to mało wydajne.
viking
Według mnie nie musisz się tym przejmować tym bardziej że nie masz jak wydajniej tego zapisać. Od czegoś union w końcu jest. Możesz spróbować z union all. Ale naprawdę. Jeśli martwisz się o wydajność tego kodu to powiem ci że ja w pracy znajdując błędy rozkładam zapytania właśnie fragmentami według UNION gdzie jest ich np 10 a każda z takich części łączy na kilkunastu innych tabelach. I to żyje i obrabia miliony rekordów w ciągu dnia wink.gif
raczkowski1
Dzięki za odpowiedź i wszelkie wskazówki.

Pozdrawiam
mortus
Jest dokładnie tak, jak pisał vikign. Nie ma innego sposobu na wyselekcjonowanie danych ze sobą logicznie nie powiązanych. Oczywiście mógłbyś zrobić tak, jak zaproponowałeś na początku, tzn. wykonać dwa zapytania dla obu tabel osobno po stronie aplikacji i połączyć wyniki, ale jest to mniej wydajne, aniżeli UNION. Po prostu takie "rzeczy" rozwiązuje się tak, a nie inaczej.
alegorn
widok w 90% jest prawidlowym rozwiazaniem, pod warunkiem ze odwolujesz sie do niego raz w trakcie sesji.

jesli potrzebujesz sie do tych danych odwolywac kilkukrotnie, przeprowadzic bardziej zaawansowane operacje - lepszym rozwiazaniem bedzie utworzenie tabeli tymczasowej.

powodow jest kilka.
pierwszym - jest to, ze tabela tymczasowa i tak jest tworzona (ORDER BY),
dwa - na czas sesji dane sa ladowane tylko raz (cos a'la zmaterializowany widok wspomniany przez @viking)

tabele tymczasowe - o ile masz mozliwosc ich jawnego tworzenia - sa bardzo pozytecznym rozwiazaniem.
moze mniej wygodne przy tworzeniu - widok tworzysz raz, tabele tymczasowe raz dla sesji..

tak naprawde wszystko zalezy od tego jak aktualne dane potrzebujesz w tej tabeli.. jesli dane moga byc aktualizowane np raz na godzine - to proponowalbym zupelnie inne rozwiazanie(choc to tez zalezy jakie masz mozliwosci)..

jesli chcesz sprawdzic wydajnosc zapytania to jedynie 'explain'
porownywanie czasow zapytan nie zawsze daje miarodajne wyniki, zbyt wiele czynnikow zmiennych ktore moga generowac dodatkowe obciazenie..

pozdrawiam,
j.
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.