Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [MySQL] Pobranie maxymalnego wyniku
Watt
post 25.03.2010, 16:05:15
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
nospor
post 26.03.2010, 08:20:55
Post #2





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




GROUP BY RAND()
nie slyszalem by mozna bylo grupowac po losowosci winksmiley.jpg
A na przyszlosc wyswietlas sobie komunikat bledu bazy to bedziesz od razu sam widzial co jest źle.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Watt
post 26.03.2010, 17:42:47
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 26.03.2010, 18:11:28
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ć smile.gif

Ten post edytował zend 26.03.2010, 19:53:15
Go to the top of the page
+Quote Post
piotrooo89
post 26.03.2010, 18:40:22
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 26.03.2010, 19:56:45
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ę 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 guitar.gif

Ten post edytował zend 26.03.2010, 19:57:52
Go to the top of the page
+Quote Post
Watt
post 26.03.2010, 21:23:52
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 26.03.2010, 21:35:26
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 26.03.2010, 21:39:32
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 26.03.2010, 21:44:45
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ć 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 26.03.2010, 21:51:28
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 26.03.2010, 21:56:19
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 26.03.2010, 22:08:08
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 26.03.2010, 22:16:42
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 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 26.03.2010, 22:19:01
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 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 26.03.2010, 22:56:43
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ą party.gif
Go to the top of the page
+Quote Post
mortus
post 27.03.2010, 07:28:13
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 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 27.03.2010, 10:26:33
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 27.03.2010, 10:30:48
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 27.03.2010, 11:21:40
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
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 04:34