Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> jak wyświetlić rekordy z kilku tabel
raczkowski1
post
Post #1





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 26.07.2007

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
mortus
post
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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]


Ten post edytował mortus 2.02.2012, 09:00:33
Go to the top of the page
+Quote Post
raczkowski1
post
Post #3





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 26.07.2007

Ostrzeżenie: (0%)
-----


Zrobiłem sobie z tego widok, tylko pytanie czy to nie jest mało wydajne?
Go to the top of the page
+Quote Post
zaajcu
post
Post #4





Grupa: Zarejestrowani
Postów: 206
Pomógł: 3
Dołączył: 18.08.2011
Skąd: Chrzanów

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
viking
post
Post #5





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


@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.
Go to the top of the page
+Quote Post
raczkowski1
post
Post #6





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 26.07.2007

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
viking
post
Post #7





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
raczkowski1
post
Post #8





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 26.07.2007

Ostrzeżenie: (0%)
-----


Dzięki za odpowiedź i wszelkie wskazówki.

Pozdrawiam
Go to the top of the page
+Quote Post
mortus
post
Post #9





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
alegorn
post
Post #10





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 20:14