[PHP][SQL] Skomplikowana paginacja
Ostatnio zmodyfikowano 2011-06-27 17:12
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? |
|
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. |
|
kamillo121 |
» 2011-06-27 00:05:14 Czytałem to kilka razy i wywnioskowałem: 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. |
|
|
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. |
|
DejaVu |
» 2011-06-27 17:12:19 Dodam tylko, że Group_Concat ma limit 255 znaków, więc wyniki mogą zostać ucięte. |
|
« 1 » |