Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wiele różnych tablic jedno zapytanie.
Forum PHP.pl > Forum > Bazy danych > MySQL
ZuyPan
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?
Niktoś
Cytat
Problemów jest sporo ponieważ baza danych jest (to moje zdanie) źle zaprojektowana.

No to fakt, relacyjna baza bez relacji 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.
ZuyPan
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.
Niktoś
Przecież w cross join nie ma złączenia ON.
Przeanalizuj jeszcze tutaj:
http://www.hiteshagrawal.com/mysql/mysql-cross-join-queries
ZuyPan
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.
Niktoś
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;
ZuyPan
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)
irmidjusz
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.
trafas
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 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.
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.