Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL] Pobranie maxymalnego wyniku
Watt
post
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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
mortus
post
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


Cytat(zend @ 26.03.2010, 22:16:42 ) *
No! Trzeba tak bylo odrazu (IMG:style_emoticons/default/smile.gif)
  1. SELECT tag_name, tag_amount FROM `mybb_stcp` WHERE tag_name != '' ORDER BY tag_amount DESC RAND() LIMIT 10
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..
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.
Cytat(Watt @ 26.03.2010, 22:08:08 ) *
Postaram sie wyjaśnić na przykładzie
[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
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?
Gdyby wartość tag_amount była różna dla każdego tag_name, to rozwiązaniem byłoby
  1. SELECT tag_name, tag_amount FROM mybb_stcp WHERE tag_name != '' AND (tag_amount=(SELECT MIN(tag_amount) FROM (SELECT tag_name, tag_amount FROM mybb_stpc ORDER BY RAND() LIMIT 4) AS temp) OR tag_amount=(SELECT MAX(tag_amount) FROM (SELECT tag_name, tag_amount FROM mybb_stcp ORDER BY RAND() LIMIT 4) AS temp)) ORDER BY tag_amount
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:
  1. SELECT tag_name, tag_amount FROM (SELECT * FROM mybb_stcp WHERE tag_name != '' ORDER BY RAND() LIMIT 4) AS temp ORDER BY tag_amount
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
Go to the top of the page
+Quote Post

Posty w temacie
- Watt   [MySQL] Pobranie maxymalnego wyniku   25.03.2010, 16:05:15
- - nospor   GROUP BY RAND() nie slyszalem by mozna bylo grupo...   26.03.2010, 08:20:55
- - Watt   Tak, ale to nie wyrzuca błędu bazy danych, Order b...   26.03.2010, 17:42:47
- - zend   [SQL] pobierz, plaintext SELECT tag_name, tag_amou...   26.03.2010, 18:11:28
- - piotrooo89   @zend Twoje zapytanie też nie jest pierwszych lotó...   26.03.2010, 18:40:22
- - zend   To nie miało być GROUP tylko ORDER zagapiłem się ...   26.03.2010, 19:56:45
- - Watt   Witam serdecznie, mam pytanie - zapytanie wyrzuca ...   26.03.2010, 21:23:52
- - zend   [SQL] pobierz, plaintext SELECT tag_name, tag_amou...   26.03.2010, 21:35:26
- - Watt   Treść błędu się zmieniła: KodMyBB has experienced ...   26.03.2010, 21:39:32
- - zend   [SQL] pobierz, plaintext SELECT tag_name, tag_amou...   26.03.2010, 21:44:45
- - Watt   Witaj, KodMyBB has experienced an internal SQL er...   26.03.2010, 21:51:28
- - zend   Chcesz największy i najmniejszy rekord? Posortowan...   26.03.2010, 21:56:19
- - Watt   Postaram sie wyjaśnić na przykładzie [Tag - tag_na...   26.03.2010, 22:08:08
- - zend   No! Trzeba tak bylo odrazu [SQL] pobierz, pl...   26.03.2010, 22:16:42
- - Watt   A da się to jakoś pomieszać - robie chmurkę tagów ...   26.03.2010, 22:19:01
- - zend   W php było by ci o niebo łatwiej [PHP] pobierz, p...   26.03.2010, 22:56:43
- - mortus   Cytat(zend @ 26.03.2010, 22:16:42 ) N...   27.03.2010, 07:28:13
- - Watt   Witam,wielkie dzięki za pomoc z tym, że to dalej n...   27.03.2010, 10:26:33
- - mortus   Spróbuj dać die(mysql_error) zamiast die (':...   27.03.2010, 10:30:48
- - zend   @mortus - dzięki, faktycznie podałem rozwiązdanie ...   27.03.2010, 11:21:40
|- - mortus   I tu znowu błądCytat(zend @ 27.03.2010, 11...   27.03.2010, 12:42:30
- - piotrooo89   o wiele wydajniejszym jest przerzucenie funkcjonal...   27.03.2010, 11:26:51
- - Watt   Właśnie, a ja nie mogę pozwolić sobie na 'szal...   27.03.2010, 17:21:34


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 04:06