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
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




GROUP BY RAND()
nie slyszalem by mozna bylo grupowac po losowosci (IMG:style_emoticons/default/winksmiley.jpg)
A na przyszlosc wyswietlas sobie komunikat bledu bazy to bedziesz od razu sam widzial co jest źle.
Go to the top of the page
+Quote Post
Watt
post
Post #3





Grupa: Zarejestrowani
Postów: 372
Pomógł: 1
Dołączył: 13.06.2008

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


Tak, ale to nie wyrzuca błędu bazy danych, Order by nie wiedziałem jak zrobić, żeby pobrało dowolnie wybrane tagi dlatego tak kombinowałem.
Go to the top of the page
+Quote Post
zend
post
Post #4





Grupa: Zarejestrowani
Postów: 580
Pomógł: 85
Dołączył: 25.03.2010
Skąd: Skrzyszów :)

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


  1. SELECT tag_name, tag_amount, MIN(tag_amount), MAX(tag_amount) FROM `mybb_stcp` WHERE tag_name IN(
  2. SELECT `tag_name` FROM `mybb_stcp` ORDER BY RAND() LIMIT 10
  3. ) LIMIT 10


Z resztą powinieneś sobie juz poradzić (IMG:style_emoticons/default/smile.gif)

Ten post edytował zend 26.03.2010, 19:53:15
Go to the top of the page
+Quote Post
piotrooo89
post
Post #5


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




@zend Twoje zapytanie też nie jest pierwszych lotów, gdzie widziałeś taka składnie do wyświetlania losowego rekordu? ~nospor już o tym wspominał.
Go to the top of the page
+Quote Post
zend
post
Post #6





Grupa: Zarejestrowani
Postów: 580
Pomógł: 85
Dołączył: 25.03.2010
Skąd: Skrzyszów :)

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


To nie miało być GROUP tylko ORDER zagapiłem się (IMG:style_emoticons/default/smile.gif)

  1. SELECT `quotes`.* FROM `quotes` ORDER BY RAND() LIMIT 1


No przykładem może być to zapytanie, które działa całkiem nieźle (IMG:style_emoticons/default/guitar.gif)

Ten post edytował zend 26.03.2010, 19:57:52
Go to the top of the page
+Quote Post
Watt
post
Post #7





Grupa: Zarejestrowani
Postów: 372
Pomógł: 1
Dołączył: 13.06.2008

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


Witam serdecznie, mam pytanie - zapytanie wyrzuca błąd:
Kod
MyBB has experienced an internal SQL error and cannot continue.

SQL Error:
    1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
Query:
    SELECT tag_name, tag_amount, MIN(tag_amount), MAX(tag_amount) FROM `mybb_stcp` WHERE tag_name IN( SELECT `tag_name` FROM `mybb_stcp` ORDER BY RAND() LIMIT 9999999 ) LIMIT 9999999
Go to the top of the page
+Quote Post
zend
post
Post #8





Grupa: Zarejestrowani
Postów: 580
Pomógł: 85
Dołączył: 25.03.2010
Skąd: Skrzyszów :)

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


  1. SELECT tag_name, tag_amount, MIN(tag_amount), MAX(tag_amount) FROM `mybb_stcp` WHERE tag_name IN(
  2. SELECT `tag_name` FROM `mybb_stcp` ORDER BY RAND()
  3. ) LIMIT 10


Spróbuj tak, bez limitu w wewnętrznym zapytaniu, poza tym lepiej by było szukać danych po id które było by typu int, a nie szukać po varchar'ach

Ten post edytował zend 26.03.2010, 21:36:48
Go to the top of the page
+Quote Post
Watt
post
Post #9





Grupa: Zarejestrowani
Postów: 372
Pomógł: 1
Dołączył: 13.06.2008

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


Treść błędu się zmieniła:
Kod
MyBB has experienced an internal SQL error and cannot continue.

SQL Error:
    1140 - Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
Query:
    SELECT tag_name, tag_amount, MIN(tag_amount), MAX(tag_amount) FROM `mybb_stcp` WHERE tag_name IN( SELECT `tag_name` FROM `mybb_stcp` ORDER BY RAND() ) LIMIT 9999999
Go to the top of the page
+Quote Post
zend
post
Post #10





Grupa: Zarejestrowani
Postów: 580
Pomógł: 85
Dołączył: 25.03.2010
Skąd: Skrzyszów :)

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


  1. SELECT tag_name, tag_amount, MIN(tag_amount), MAX(tag_amount) FROM `mybb_stcp` WHERE tag_name IN(
  2. SELECT `tag_name` FROM `mybb_stcp` ORDER BY RAND()
  3. ) LIMIT 10 GROUP BY tag_name


Jaką wersję mysql'a masz? Coś mi na to wygląda że ta nasza zabawka nie ma ochoty pracować (IMG:style_emoticons/default/smile.gif) Mógł byś jeszcze raz sprecyzować problem?

Ten post edytował zend 26.03.2010, 21:52:45
Go to the top of the page
+Quote Post
Watt
post
Post #11





Grupa: Zarejestrowani
Postów: 372
Pomógł: 1
Dołączył: 13.06.2008

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


Witaj,

Kod
MyBB has experienced an internal SQL error and cannot continue.

SQL Error:
    1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY tag_name' at line 5
Query:
    SELECT tag_name, tag_amount, MIN(tag_amount), MAX(tag_amount) FROM `mybb_stcp` WHERE tag_name IN( SELECT `tag_name` FROM `mybb_stcp` ORDER BY RAND() ) LIMIT 10 GROUP BY tag_name


Wersja klienta MySQL: 4.1.10
Go to the top of the page
+Quote Post
zend
post
Post #12





Grupa: Zarejestrowani
Postów: 580
Pomógł: 85
Dołączył: 25.03.2010
Skąd: Skrzyszów :)

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


Chcesz największy i najmniejszy rekord? Posortowane rekordy z losowych? Czy może jeszcze coś innego?

  1. SELECT tag_name, tag_amount, MIN(tag_amount), MAX(tag_amount) FROM `mybb_stcp`

Zapytanie tego typu zwraca jeden rekord z wartością największą i najmniejszą, a nie wiem czy w tym rzecz

Ten post edytował zend 26.03.2010, 21:58:38
Go to the top of the page
+Quote Post
Watt
post
Post #13





Grupa: Zarejestrowani
Postów: 372
Pomógł: 1
Dołączył: 13.06.2008

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


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
Go to the top of the page
+Quote Post
zend
post
Post #14





Grupa: Zarejestrowani
Postów: 580
Pomógł: 85
Dołączył: 25.03.2010
Skąd: Skrzyszów :)

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


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

Ten post edytował zend 26.03.2010, 22:18:46
Go to the top of the page
+Quote Post
Watt
post
Post #15





Grupa: Zarejestrowani
Postów: 372
Pomógł: 1
Dołączył: 13.06.2008

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


A da się to jakoś pomieszać - robie chmurkę tagów i to będzie średnio wyglądało jak to będzie po kolei, chciałem żeby to wyglądało jak chmurka (IMG:style_emoticons/default/smile.gif) Szkoda troche php do tego uzywać jak możliwie da sie to zrobić via mysql?

Ten post edytował Watt 26.03.2010, 22:46:11
Go to the top of the page
+Quote Post
zend
post
Post #16





Grupa: Zarejestrowani
Postów: 580
Pomógł: 85
Dołączył: 25.03.2010
Skąd: Skrzyszów :)

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


W php było by ci o niebo łatwiej

  1. $maxValue = 0;
  2. $minValue = 0;
  3. $maxRecord = null;
  4. $minRecord = null;
  5. $output = '<ul>';
  6.  
  7. while($nextRow)
  8. {
  9. if($nextRow['value'] > $maxValue)
  10. {
  11. $maxValue = $nextRow['value'];
  12. $maxRecord = $nextRow;
  13. }
  14.  
  15. if($nextRow['value'] < $minValue)
  16. {
  17. $minValue = $nextRow['value'];
  18. $minRecord = $nextRow;
  19. }
  20.  
  21. $output .= '<li>'.$nextRow['tag_name'].'</li>';
  22. }
  23.  
  24. $output .= '</ul>';


Możesz zastosować takie rozwiązanie jeżeli szkoda Ci przelecieć wyniki zapytania jeszce jedną pentlą (IMG:style_emoticons/default/party.gif)
Go to the top of the page
+Quote Post
mortus
post
Post #17





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
Watt
post
Post #18





Grupa: Zarejestrowani
Postów: 372
Pomógł: 1
Dołączył: 13.06.2008

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


Witam,wielkie dzięki za pomoc z tym, że to dalej nie działa prawidłowo - odwołałem się tak:
  1. $stcp_query = $db->query("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_stcp 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") or die(':<');
  2. while($stcp_fetch = $db->fetch_array($stcp_query))
  3. {
  4.  
  5. $tag = $stcp_fetch['tag_name'];
  6. $tagsiz = $stcp_fetch['tag_amount'];
  7. $max_tagsize = $stcp_fetch['MAX(tag_amount)'];
  8. $min_tagsize = $stcp_fetch['MIN(tag_amount)'];
  9. echo $tag." ".$tagsiz."<br />";
  10. }

I nie zwraca mi wyników - co jest tego przyczyną?

Ten post edytował Watt 27.03.2010, 10:27:25
Go to the top of the page
+Quote Post
mortus
post
Post #19





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

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


Spróbuj dać die(mysql_error) zamiast die (':<'). Zobaczysz, czy zapytanie się wykonuje, czy wywala błąd.
EDIT:
Zapytanie testowałem i powinno działać zarówno na MySQL-u w wersji 4.1.10, jak i nowszym.

Ten post edytował mortus 27.03.2010, 10:33:27
Go to the top of the page
+Quote Post
zend
post
Post #20





Grupa: Zarejestrowani
Postów: 580
Pomógł: 85
Dołączył: 25.03.2010
Skąd: Skrzyszów :)

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


@mortus - dzięki, faktycznie podałem rozwiązdanie z błędem składniowym
  1. SELECT tag_name, tag_amount FROM `mybb_stcp` WHERE tag_name != '' ORDER BY tag_amount RAND() LIMIT 10

Ale to zapytanie i ten kawałek php które podałem kilka postów wyżej powinny załatwić sprawę
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 26.09.2025 - 19:25