![]() |
![]() |
![]() ![]()
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:
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 |
|
|
![]() |
![]()
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:
Ten post edytował mortus 2.02.2012, 09:00:33 |
|
|
![]()
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?
|
|
|
![]()
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
|
|
|
![]()
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.
|
|
|
![]()
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. |
|
|
![]()
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)
|
|
|
![]()
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 |
|
|
![]()
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.
|
|
|
![]()
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. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 20:14 |