![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 566 Pomógł: 35 Dołączył: 21.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Witajcie!
Zastanawiam się w jaki sposób phpMyAdmin "wie", że będzie następna strona w wynikach? Staram się zrobić dobrą paginację bez uciekania się do zastąpienia pól za pomocą COUNT(`id`) - wymusza to na mnie podwójne wykonanie zapytania, raz na całości [która może mieć i 80 tys rekordów] a drugi raz już z limitem. Do tego problem stwarzają skomplikowane zapytania (których wyniki są jednak cachowane). -------------------- flexiCMS v2 [|||||||+--] 75% done
|
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Staram się zrobić dobrą paginację bez uciekania się do zastąpienia pól za pomocą COUNT(`id`) To się wyklucza wzajemnie. Paginacja to nic innego jak zliczenie i operowanie limitem. Reszta nie jest zależna od samego zapytania, a od tego jak te dane wyświetlisz. Ten post edytował !*! 4.07.2012, 12:21:40 -------------------- Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta). |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 709 Pomógł: 176 Dołączył: 24.10.2010 Ostrzeżenie: (0%) ![]() ![]() |
jest jeszcze:
SQL_CALC_FOUND_ROWS jednak nie zawsze to dobry pomysł aby dowiedzieć się dlaczego, wystarczy w google wpisać ![]() -------------------- http://d3ut3r.wordpress.com/ | mysql_* jest przestarzałe UŻYWAJ PDO!
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
Jeśli robisz prostą przeglądarkę tabel (bez połączeń z innymi tabelami i bez warunków), to z:
SELECT * FROM information_schema.tables WHERE table_schema = 'twoja_baza_danych' and table_name='twoja_tabela' możesz wyciągnąć podstawowe informacje jak. np. ilość rekordów (TABLE_ROWS), tylko że dla InnoDB są to wartości przybliżone... Więc tak naprawdę nie ma innego sposobu jak liczenie najpierw... |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 744 Pomógł: 118 Dołączył: 14.02.2009 Skąd: poziome Ostrzeżenie: (0%) ![]() ![]() |
To sie robi troche inaczej.
Zalozenie ze na stronie wyswietlasz 20 wynikow. Chcesz zrobic tak ze w paginacji jest 1 - 2 - (3)- 4 > Zalozmy ze jestes na 3 stronie, pobierasz wtedy zapytaniem z limitem 3*20, 21 wierszy (nie 20 tylko 21 poniewasz jak dostaniesz mniej niz 21 to znaczy ze nie ma nastepnej strony), a jak dostaniesz 21 to wiesz ze jest nastepna strona. -------------------- śmieszne obrazki
Kryzys: Ser jem spleśniały, wino piję stare i samochód mam bez dachu.. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 348 Pomógł: 26 Dołączył: 8.10.2008 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
Lekka przesada.
Ja jestem za tradycyjnym count(id). Jeżeli się mylę to mnie poprawcie ale chyba czytałem gdzieś, że count(id) nie 'liczy' wszystkiego (o ile id jest primary) tylko zwraca sumę rekordów w przeciwieństwie do count(*). -------------------- Wolałem języki z rodziny C ale poszedłem na łatwizne...
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 142 Pomógł: 24 Dołączył: 30.03.2009 Skąd: Rokitno Szlacheckie Ostrzeżenie: (0%) ![]() ![]() |
z tego co mi wiadomo to count nie zlicza wartości null
więc jeśli masz id == NULL to może go nie zliczyć przy count(id), ale przy count(*) już może zliczyć. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 592 Pomógł: 62 Dołączył: 3.08.2006 Ostrzeżenie: (0%) ![]() ![]() |
zróbcie sobie testy wydajności zapytania count(id), gdzie id to primary key
przecież to indeks, nie wierzę, że nie zapisałby sobie 4 bajtów na inta, a sądząc po tym, że do szukania korzysta z szukania binarnego, to musi znać granice przedziałów, więc, wg mnie to tylko odczytanie inta i zwrócenie, oczywiście zapytanie mozna sobie wczesniej "spreparować" czy utworzyć procedurę w mysql, żeby nie tracić czasu na parsowanie zapytania -------------------- :]
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 348 Pomógł: 26 Dołączył: 8.10.2008 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
z tego co mi wiadomo to count nie zlicza wartości null więc jeśli masz id == NULL to może go nie zliczyć przy count(id), ale przy count(*) już może zliczyć. Primary key dodatkowo z AUTO INCREMENT nigdy nie będzie pusty... Ten post edytował Adi32 5.07.2012, 15:08:23 -------------------- Wolałem języki z rodziny C ale poszedłem na łatwizne...
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Przy LEFT/RIGHT JOINie może być Hm podaj jakiś przykład, bo chyba Cie nie rozumiem. -------------------- Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta). |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 348 Pomógł: 26 Dołączył: 8.10.2008 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
Jemu chyba chodziło o to, że jeżeli w zapytaniu w którym są JOINY pole id może być puste.
Wydaje mi sie, że jest to raczej nie możliwe, jakie zapytanie by nie było id nie zgubi swojej zawartości. Dodatkowo zastanawiam się, czy przy robieniu stronicowania istnieje opcja, żeby trzeba było robić JOINy... (?) Edit: Chodzi o zapytanie zliczające (lub pobierające) ilość elementów. Ten post edytował Adi32 5.07.2012, 15:27:23 -------------------- Wolałem języki z rodziny C ale poszedłem na łatwizne...
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 9.08.2025 - 21:11 |