Cytat(zend @ 26.03.2010, 22:16:42 )

No! Trzeba tak bylo odrazu

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
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:
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).