![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 372 Pomógł: 1 Dołączył: 13.06.2008 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Chciałem pobrać wyniki uszeregowane rand, maxymalny i minimalny wyknik zapytaniem: Kod query("SELECT tag_name, tag_amount, MIN(tag_amount), MAX(tag_amount) FROM `mybb_stcp` WHERE tag_name != '' GROUP BY RAND() LIMIT ".$amount) Dokładniej: Skrypt pobiera 10 rekordów, w tych 10 szuka największego i pokazuje go (muszę od razu [po pierwszej petli] mieć największy wynik). I nie wykonuje sie poprawnie - dlaczego ? Ten post edytował Watt 25.03.2010, 16:07:37 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
No! Trzeba tak bylo odrazu (IMG:style_emoticons/default/smile.gif) Po pierwsze zapytanie składniowo niepoprawne (brakuje przecinka po tag_amount DESC). Po drugie zapytanie nie działa tak, jak powinno. Dlaczego? Ano dlatego, że najpierw sortuje malejąco po kolumnie tag_amount, a później to co już zostało posortowane ma posortować w sposób losowy i nie sortuje. Wynikiem zapytania zawsze będą te same rekordy, czyli 10 rekordów z całej tabeli mybb_stcp, których tag_amount jest największe.Teraz największy rekord będzie na samym początku, a najmniejszy na końcu. Ale dalej nie rozumiem po co ten warunek sprawdzający czy dany tag nie jest pusty.. Postaram sie wyjaśnić na przykładzie Jeśli wartość tag_amount może się powtarzać, to zapytanie, które wybiera z pośród kilku losowych rekordów rekord o największym i najmniejszym tag_amount nie ma sensu. Dlaczego? Dlatego, że może być kilka rekordów o najmniejszym lub największym tag_amount. Obrazując: załóżmy, że z przykładowych danych, które podałeś wylosowaliśmy 4 rekordy zawierające tag_name i tag_amount. Niech to będą: [hahaha - 3], [forum - 6], [lol - 2] i [php - 2]. Zauważ, że w wylosowanych rekordach mamy dwa, które mają najmniejsze tag_amount. Które zatem mamy wybrac?[Tag - tag_name] - [Ilość tagów - tag_amount] lol - 2 lubie - 4 placki - 7 lalala - 1 hahaha - 3 forum - 6 php - 2 Zapytanie ma pobrac powiedzmy 4 losowe tagi i z nich wybrac największy i najmniejszy. Przyklad: lol, hahaha, forum, lubie Najmniejszy: lol Największy: forum Gdyby wartość tag_amount była różna dla każdego tag_name, to rozwiązaniem byłoby przy czym pierwszy wiersz zawierałby najmniejszą wartość tag_amount, a drugi największą. Rozwiązanie takie zadziała również dla powtarzających się wartości tag_amount, ale z losowych rekordów wybierze wszystkie, które mają tag_amount najmniejsze i wszystkie, które mają tag_amount największe. EDIT: Po namyśle nadal nie jestem pewien, czy powyższe zapytanie zadziała bezbłędnie. Na pewno bezbłędnie zadziała coś takiego: przy czym rekordy o najmniejszym tag_amount będą pierwsze (nie wiemy ile ich będzie, jeśli wartość tag_amount może się powtarzać), a rekordy o największym tag_amount będą ostatnie (i też nie wiemy ile ich będzie, jeśli wartość tag_amount może się powtarzać). Oczywiście LIMIT dowolny (ja wpisałem 4). Ten post edytował mortus 27.03.2010, 07:44:22 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 3.10.2025 - 04:06 |