Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] sortowanie liczb
rybosom
post
Post #1





Grupa: Zarejestrowani
Postów: 82
Pomógł: 0
Dołączył: 6.09.2004

Ostrzeżenie: (20%)
X----


ciąglę się uczę i nie mogę zrozumieć jednego, dlaczego mi tak dziwnie sortuje zapytanie

baza jest następująca

  1. CREATE TABLE IF NOT EXISTS `ping` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `domena` varchar(255) NOT NULL,
  4. `ms` int(4) NOT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=latin2 AUTO_INCREMENT=18;
  7.  
  8. INSERT INTO `ping` (`id`, `domena`, `ms`) VALUES
  9. (1, 'netflix.com', 307),
  10. (2, 'netflix.com', 171),
  11. (3, 'netflix.com', 179),
  12. (4, 'netflix.com', 178),
  13. (5, 'netflix.com', 172),
  14. (6, 'mbank.pl', 83),
  15. (7, 'wp.pl', 40),
  16. (8, 'wp.pl', 40),
  17. (9, 'wp.pl', 40),
  18. (10, 'wp.pl', 40),
  19. (11, 'wp.pl', 40),
  20. (12, 'wp.pl', 40),
  21. (13, 'onet.pl', 72),
  22. (14, 'onet.pl', 46),
  23. (15, 'onet.pl', 45),
  24. (16, 'onet.pl', 45),
  25. (17, 'onet.pl', 46);


a zapytanie
  1. SELECT DISTINCT (domena), ms FROM ping GROUP BY domena ORDER BY ms ASC

zwraca

wp.pl 40 ms
onet.pl 72 ms
mbank.pl 83 ms
netflix.com 307 ms

czy błąd jest w strukturze bazy (INT dla ms) czy w zapytaniu?
Go to the top of the page
+Quote Post
redeemer
post
Post #2





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


Nie napisałeś jakiego wyniku oczekujesz.

Może chodzi Ci o:
  1. SELECT domena,min(ms) AS min_ms FROM ping GROUP BY domena ORDER BY min_ms
http://sqlfiddle.com/#!2/38a329/9
Go to the top of the page
+Quote Post
rybosom
post
Post #3





Grupa: Zarejestrowani
Postów: 82
Pomógł: 0
Dołączył: 6.09.2004

Ostrzeżenie: (20%)
X----


dobrze zgadłeś, chodziło o min() (IMG:style_emoticons/default/wink.gif)
dużo nauki jeszcze przede mną
Go to the top of the page
+Quote Post
pmir13
post
Post #4





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


GROUP BY służy do wykorzystywania z funkcjami agregującymi, takimi jak COUNT(), SUM(), MIN(), MAX() itd. Baza danych widzać takie coś w zapytaniu każdą grupę (w przypadku `GROUP BY domena` wszystkie rekordy mające taką samą domenę) spłaszcza do jednego rekordu. Przy standardowej składni w SQL w SELECT nie można wrzucić nic oprócz kolumn po których grupujemy i funkcji agregujących. Mysql pozwala na trochę więcej, można również dodać inne kolumny (które określa się w tym wypadku jako hidden columns), ale trzeba wiedzieć, że nie wiemy z którego dokładnie rekordu w danej grupie zostaną pobrane do nich dane. Przy prostej tabeli najprawdopodobniej będzie to pierwszy rekord z grupy wg klucza głównego, ale przy istniejących innych indeksach może być zupełnie inaczej.

To tak jak gdyby zapytać się:
- Jaka jest najwyższa pensja w firmie, jaka jest najniższa i jak się nazywa pracownik?
- Ale który pracownik?
- Którykolwiek

Wracając do podanego zapytania - grupujesz wg domeny, dla każdej bierzesz pierwszy z brzegu ping i otrzymany set sortujesz wg najmniejszego pingu.
ORDER BY zawsze sortuje wyniki już pogrupowane, jeśli chcesz dla każdej znaleźć najmniejszy to po prostu użyj MIN(ms).
Go to the top of the page
+Quote Post
YourFrog
post
Post #5





Grupa: Zarejestrowani
Postów: 124
Pomógł: 22
Dołączył: 10.01.2014

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


Dodam tylko do tego co napisali poprzednicy że propozycja struktury którą podałeś jest błędna bo będzie żreć więcej miejsca niż rozbicie tego na 2 tabele.
Go to the top of the page
+Quote Post

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.08.2025 - 14:20