![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 651 Pomógł: 116 Dołączył: 3.06.2012 Skąd: Lędziny Ostrzeżenie: (0%) ![]() ![]() |
Posiadam system tagowania w swoim CMS'ie. Tabela z tagami wygląda tak:
|TAG_ID|TAG_POSTS|TAG_TITLE| | 2 | 44 | PHP Gdzie tag_id to ID danego tagu, tag_posts to liczba - do ilu wpisów dany tag jest przypisany oraz tag_title to nazwa tagu. Chciałem zrobić sobie tzw. chmurę tagów, czyli wyświetlanie kilkunastu losowych tagów na stronie głównej. Oczywiście, jeden większą czcionką, drugi mniejszą, jeden pogrubiony, drugi nie - wszystko zależne od tego, do ilu wpisów dany tag jest przypisany. No i w efekcie stworzyłem sobie taką funkcję:
Tylko, że nie bardzo przypadł mi do gustu ten pomysł z cachowaniem tagu, z największą ilością wystąpień w postach. Obecnie zmienna $count_best_tag zawiera informację z pola tag_posts, tagu który najwięcej razy jest przypisany do postów, potem obliczam na podstawie tej liczby procent wystąpień danego tagu w stosunku do tego najczęściej występującego i odpowiednio go odpicowuję za pomocą CSS. Co chcę osiągnąć? Chcę wyciągnąć z bazy X tagów (załóżmy 20, to ustawia się ogólnie jako argument funkcji) i w zmiennej $count_best_tag też przetrzymywać największy tag_posts, ALE z wylosowanych 20 wyników, nie ogólnie z całej bazy. No i właśnie nie wiem jak tego dokonać, tutaj prosiłbym o jakieś rady. Wtedy wszystko będę miał w jednym zapytaniu, bez angażowania dodatkowego, drugiego bądź też bez korzystania z cache. |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat ALE z wylosowanych 20 wyników, nie ogólnie z całej baz Nie bardzo rozumiem w czym masz problem.... Mając 20 wartosci, nie jesteś w stanie stwierdzić, która z nich jest największa? No tak właśnie wynika z opisu Twojego problemu....
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 651 Pomógł: 116 Dołączył: 3.06.2012 Skąd: Lędziny Ostrzeżenie: (0%) ![]() ![]() |
Może nie tyle 'nie wiem jak' co 'nie wiem w jaki sposób'.
Mając pętlę while:
mogę sobie wypisać wszystkie tag_posts i potem wybrać ten największy, ale co potem...? Stworzę kolejną pętlę while(), tyle że tym razem już taką:
gdzie $count_best_tag to największy $count[X] ? Bez sensu tworzyć dwie pętle, dlatego pytam jak na starcie pętli while() uzyskać od razu największy wynik tag_posts, abym mógł go użyć do obliczeń? |
|
|
![]()
Post
#4
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
No tak, dwie pętle w php
![]() -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 651 Pomógł: 116 Dołączył: 3.06.2012 Skąd: Lędziny Ostrzeżenie: (0%) ![]() ![]() |
A nie da się tego wydobyć jakoś samym zapytaniem? Próbowałem użyc takiego zapytania:
Kod SELECT tag_id, tag_posts, tag_title, MAX(tag_posts) AS count_best_tag FROM `tags` ORDER BY RAND() LIMIT 20 Ale ono zwraca tylko 1 rekord, jakby ignoruje to 'LIMIT 20' ;/ |
|
|
![]()
Post
#6
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Jakby sie dało, to bym ci powiedzial
![]() Ty sie nie boj tych dwóch pętli. One nic ci nie zrobią... -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 651 Pomógł: 116 Dołączył: 3.06.2012 Skąd: Lędziny Ostrzeżenie: (0%) ![]() ![]() |
Spoko, wartość max. już mi wyciąga tylko pojawił się kolejny problem... Druga pętla while() jest pomijana, nie wiem czemu. W ogóle jej nie wczytuje. |
|
|
![]()
Post
#8
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Ponieważ przeleciales przez wszystkie wyniku z bazy. Albo zresetuj znacznik mysql, albo zapisz w pierwszej petli wszystko do tablicy, a w drugiej lec po tej tablicy...
ps: ten max to wyliczasz poprostu niesamowicie...nawet nie sądziłem że można tak zepsuć ten algorytm ![]() -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 651 Pomógł: 116 Dołączył: 3.06.2012 Skąd: Lędziny Ostrzeżenie: (0%) ![]() ![]() |
Metodą prób i błędów - udało się. Dzięki wielkie...
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Poprawiłeś wyliczanie tego max?
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 34 Pomógł: 11 Dołączył: 10.06.2011 Skąd: świdnica Ostrzeżenie: (0%) ![]() ![]() |
to ja moze zaproponuje inne rozwiazanie:
dane z db wyciagniemy sobie od razu posortowane malejaco, przez co nasz MAX() bedzie zawsze pierwszym zwroconym rekordem, u mnie wygladaloby to mniej wiecej tak
w skrocie wyciagamy najpierw 20 losowych wierszy, po czym sortujemy je wg uznania. a przy uzyciu sqlowego MAX() dostajesz tylko jeden rekord, bo max() to funkcja agregujaca, wiec zeby dostac cos wiecej musisz pogrupowac (group by) pozdrawiam Ten post edytował sh3d2 31.01.2013, 20:09:24 |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 651 Pomógł: 116 Dołączył: 3.06.2012 Skąd: Lędziny Ostrzeżenie: (0%) ![]() ![]() |
Moja funkcja obecnie wygląda tak:
Proponujecie coś jeszcze poprawić/zmienić? |
|
|
![]()
Post
#13
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
No, i teraz max liczysz tak jak trzeba
![]() -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 11:58 |