Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] sortowanie liczb
Forum PHP.pl > Forum > Przedszkole
rybosom
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?
redeemer
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
rybosom
dobrze zgadłeś, chodziło o min() wink.gif
dużo nauki jeszcze przede mną
pmir13
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).
YourFrog
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.