Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[PHP][SQL] Skomplikowana paginacja

Ostatnio zmodyfikowano 2011-06-27 17:12
Autor Wiadomość
absflg
Temat założony przez niniejszego użytkownika
[PHP][SQL] Skomplikowana paginacja
» 2011-06-26 13:07:35
Mam dwie tablice. Podaje tu okrawając ze zbędnych treści.
Pierwsza: id | user_id
Druga to odpowiadające pierwszej właściwości.
Druga: id | idmain | text

Chce podzielić elementy z Pierwsza na strony z odnośnikami. W przypadku innych treści odpowiednio dobieram LIMIT. Jednak poza treścią z Pierwsza na liście muszą pojawić się jej właściwości z tablicy Druga. Jako, że nie ma w SQL funkcji agregującej sklejającej stringi, muszę to zrobić po odebraniu przez PHP. W wyniku tego robię to tak, że łącze te tablice zwykłym LEFT OUTER JOIN z warunkiem Pierwsza.id=Druga.idmain. W ten sposób uzyskuje wszystkie potrzebne dane. Ale w wyniku tego, że liczba właściwości jest zmienna, liczba komórek, LIMIT więc na niewiele się zda. Czy mogę w prosty sposób ustalić limit komórek tylko z jednej z łączonych w zapytaniu tablic?
P-34714
DejaVu
» 2011-06-26 16:53:30
Nie rozumiem o co Ci chodzi ;p

/edit:
Dodam jeszcze, że nie wiadomo jaki jest związek między obiema tablicami, tj. co jest kluczem obcym z tablicy A do B czy na odwrót.
P-34724
kamillo121
» 2011-06-27 00:05:14
Czytałem to kilka razy i wywnioskowałem:
  • Mylisz pojęcia LIMIT oznacza ile rekordów ma zwrócić szukanie
  • Przy przyłączaniu DRUGIEJ do PIERWSZEJ nie musisz rąbać całej tablicy, zamiast podawać nazwę tabeli podajesz DRUGA.nazwa_pola, DRUGA.nazwa_pola_jakas_tam o ile o to Ci chodzi.

Jeżeli chcesz uzyskać coś takiego, że w tabeli DRUGA masz rekordy z opcjami i te właśnie rekordy chcesz przyłączyć do rekordu odpowiadającego z tabli PIERWSZA to najszybciej będzie jak pobierzesz osobno rekordy z tabeli PIERWSZA i DRUGA i na końcu to będziesz sklejał albo mądrze się odwoływał.

Nazwa tematu nie jest trafiona. Nie wiem czy istnieje takie słowo jak pageinacja, zapewne chodziło o słowo paginacja oznaczające porcjowanie wyników. Jak wynika z wątku chodzi o problem z pobraniem komórek a nie z dzieleniem wyników na porcje.
P-34768
absflg
Temat założony przez niniejszego użytkownika
» 2011-06-27 11:10:33
Myślałem, że źle opisałem coś nie tak. Ale czytając pierwszy post nad ranem nadal wszystko rozumiem i wydaje się jasne... Zacznę jeszcze raz:

Między tabeli Pierwsza łączy się z tabelą Druga. Relacja jest jeden do wielu, do jednej komórki z tabeli Pierwsza może pasować od zera do nieskończoności (w teorii :]) komórek z tabeli. Po otrzymaniu tego do PHP wyświetlam to jako tablicę w postaci:
Nazwa (z Pierwsza) | Parametry (z Druga)
Z tym, że do każdej nazwy z Pierwsza może pasować wiele parametrów z Druga. Są one wtedy łączone.
Struktura tabel:
Pierwsza:
id | Nazwa
Druga:
id | Parametr
Kluczem łączącym tabele jest id.


Z zapytania:

SELECT P.id, P.nazwa, D.Parametr
FROM Pierwsza P LEFT OUTER JOIN Druga D ON P.id=D.id ;

Uzyskuję więc coś takiego:

P.id| P.nazwa | D.Parametr
---------------------------
  1 | Nazwa1  | ParametrA
  2 | Nazwa1  | ParametrB
  3 | Nazwa2  | ParametrC


I "sklejam" to w PHP do takiej postaci:

 Nazwa1 : ParametrA, ParametrB
 Nazwa2 : ParametrC


I DOTĄD NIE MAM PROBLEMU.

Chcę jednak, aby na stronie ukazywała się tylko ustalona liczba nazw. Nie mogę ustawić tego przy pomocy LIMIT, gdyż liczba nazw nie równa się liczbie rekordów wyniku. Ideę tego przedstawia to niedziałające coś poniżej.
!PSEUDOKOD!
SELECT P.id, P.nazwa, D.Parametr
FROM (Pierwsza P LIMIT 30, 60 ) LEFT OUTER JOIN Druga D ON P.id=D.id ;


Mam nadzieję, że tym razem zostałem zrozumiany.

//EDIT
Próbowałem przeskoczyć nieistniejące przeszkody :D

SELECT P.id, P.nazwa, GROUP_CONCAT(D.parametr,'|')
FROM Pierwsza P LEFT OUTER JOIN Druga D ON P.id=D.id
GROUP BY P.id


Problem rozwiązany.
P-34783
DejaVu
» 2011-06-27 17:12:19
Dodam tylko, że Group_Concat ma limit 255 znaków, więc wyniki mogą zostać ucięte.
P-34802
« 1 »
  Strona 1 z 1