Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wiele różnych tablic jedno zapytanie.
ZuyPan
post
Post #1





Grupa: Zarejestrowani
Postów: 116
Pomógł: 4
Dołączył: 4.02.2010

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


Witam.
Od jakiegoś czasu realizuję pewien projekt. Problemów jest sporo ponieważ baza danych jest (to moje zdanie) źle zaprojektowana. Końcowym produktem ma być LogViewer wyświetlający logi z sześciu różnych tabel z filtrami i stronicowaniem. Wszystko było by dużo prostrze gdyby logi były w jednej tabeli a są w aż sześciu i to o różnych strukturach. Problem jest konkretnie ze stronicowaniem. W jaki sposób pobrać wszystko z tych tablic aby móc zrobić LIMIT w zapytaniu (od tego do tego rekordu, w zależności od aktualnej strony). UNION nie zadziała ze względu na różne struktury, o joinach można zapomnieć ponieważ nie ma żadnych relacji a pole klucz (ai) posiada tylko jedna z tych tabel. Pomysły?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
Niktoś
post
Post #2





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Cytat
Problemów jest sporo ponieważ baza danych jest (to moje zdanie) źle zaprojektowana.

No to fakt, relacyjna baza bez relacji (IMG:style_emoticons/default/baaasmiley.gif)

Możesz spróbować pokombinować z cross join:
http://www.roseindia.net/sql/sqljoin/mysql-cross-join.shtml
http://stackoverflow.com/questions/8473625...ut-relationship

Najlepiej przeprojektować bazę danych , brak indexów-ma znaczenie przy optymalizacji i szybkości wykonywania się zapytań-będzie działać znacznie wolniej niż w przypadku tabel indeksowanych.Brak wiązań danych ,będzie utrudniało wyciąganiu odpowiednich danych-będziesz musiał budować zawiłe kwerendy, które będą się także wolniej wykonywały.

Ten post edytował Niktoś 28.07.2012, 17:10:22
Go to the top of the page
+Quote Post
ZuyPan
post
Post #3





Grupa: Zarejestrowani
Postów: 116
Pomógł: 4
Dołączył: 4.02.2010

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


Co do przeprojektowania bazy danych to nie ma takiej opcji ponieważ jest to baza pewnej gry mmorpg i za dużo z tym roboty (poza tym ja tylko tworzę LogViewer, nie mam wpływu na krztałt bazy).
Na mój rozum cross join też odpada bo nie mam czego podać po ON w zapytaniu.
Go to the top of the page
+Quote Post
Niktoś
post
Post #4





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Przecież w cross join nie ma złączenia ON.
Przeanalizuj jeszcze tutaj:
http://www.hiteshagrawal.com/mysql/mysql-cross-join-queries
Go to the top of the page
+Quote Post
ZuyPan
post
Post #5





Grupa: Zarejestrowani
Postów: 116
Pomógł: 4
Dołączył: 4.02.2010

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


Fakt, coś mi się ubzdurało - mniejsza z tym. Przy CROSS JOIN zapytanie trwa już ponad 5 minut i końca nie widać. Odpada.
Na forum frameworka którego używam polecono mi widoki. Przyznam się szczerze czytałem, ale ani trochę nie rozumiem jak miały by mi pomóc.
Go to the top of the page
+Quote Post
Niktoś
post
Post #6





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Tutaj masz jak wykorzystać widoki:
http://www.java2s.com/Tutorial/MySQL/0180_...ngtwotables.htm
, ale i tak podczas tworzenia będziesz musiał zespolić dane z różnych tabel.Widok uprości Ci tylko sposób odwołania się do bazy danych w Twoim skrypcie php.
Będziesz musiał użyć polecenia cross join w widoku i odwołujesz się w php do widoku zamiast konkretnej/-ych tabel/-i.
Coś w stylu:

Select * from Moj_Widok;

Ten post edytował Niktoś 28.07.2012, 18:05:28
Go to the top of the page
+Quote Post
ZuyPan
post
Post #7





Grupa: Zarejestrowani
Postów: 116
Pomógł: 4
Dołączył: 4.02.2010

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


Troche się pobawiłem tymi widokami i wyszło mi coś czego nie chcę. Mianowicie dostałem widok o strukturze gdzie jeden rekord posiada wszystkie pola z tych 6 różnych tabel. To błąd bo ja chcę czegoś innego. Nie chodzi mi o to aby każdy rekord miał dane z tych 6 tabel a by stworzyła się taka jak by tablica w w której kolejno ułożone są (jeden pod drugim) rekordy z wszystkich sześciu tabel.
Coś w stylu:
  1. $tablica[0] = pierwszy rekord z pierwszej tabeli;
  2. $tablica[1] = drugi rekord z pierwszej tabeli;
  3. $tablica[...] = ...
  4. $tablica[10] = pierwszy rekord z drugiej tabeli
  5. $tablica[11] = drugi rekord z drugiej tabeli;
  6. ...
  7. $tablica[100] = ostatni rekord z szóstej tabeli;

Czyli tak jak bym zrobił 6 zwykłych zapytań i każdy rekord z tych zapytań jest kolejnym elementem tablicy je zawierającej. Tak wyświetlam dane, ale przy paginacji muszę pobrać je wszystkie naraz by nałożyć limity w zapytaniu (w zależności od aktualnie wyświetlanej strony)
Go to the top of the page
+Quote Post
irmidjusz
post
Post #8





Grupa: Zarejestrowani
Postów: 279
Pomógł: 60
Dołączył: 25.02.2012

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


A spróbuj zrobić sześć odrębnych widoków, aby każdy wyświetlał logi z odpowiedniej tabeli w taki sam sposób (czyli by doprowadzić do ujednoliconego formatu). I na koniec siódmy widok wyświetlający posortowane wiersze z pozostałych widoków.
Go to the top of the page
+Quote Post
trafas
post
Post #9





Grupa: Zarejestrowani
Postów: 87
Pomógł: 12
Dołączył: 31.05.2006

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


A może zamiast się grzebać w widokach ( które i tak będą się pewnie trochę kręciły ) lepiej byłoby napisać procedurkę, która zbierałaby dane z tych cześciu tabel do jednej nowo utworzonej przez Ciebie tabeli (IMG:style_emoticons/default/questionmark.gif)

Miałbyś już wtedy jednolitą konstrukcję tabeli, założyłbyś na niej odpowiednie indeksy i wyciąganie danych byłoby znacznie prostsze.

Napełnianie tej tabeli mógłbyś zaplanować po północy każdego dnia np. z ograniczeniem danych do poprzedniego dnia.

Ten post edytował trafas 3.08.2012, 11:24:52
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: 22.08.2025 - 12:27