2013-07-10 12 views
5

mam problem próbuje odebrać max courseidmySQL max() nie wraca maksymalny wynik

danych:

coursename courseid  
---------- -------- 
0001_Course JAS9997 
0002_Course JAS9998 
0003_Course JAS9999 
0004_Course JAS10000 

Zapytanie:

SELECT max(courseid) FROM tblcourse WHERE courseid LIKE '%JAS%' 

jak jest, aby zawęzić do courseid że zacznij od JAS.

Zapytanie zwraca tylko JAS9999 jako wynik maksymalny, ale maksimum courseid to JAS10000. Czy czegoś brakuje?

+1

Kursy że ___begin___ z 'JAS' powinno być jak' 'JAS%' '... kursów, które ___contain___' JAS' będzie LIKE ''% JAS%'' –

Odpowiedz

6

Nie można wykonać MAX na liczbach osadzonych w tekście takim jak ten. Tworzy kolejność alfabetyczną, a więc JAS9 idzie po JAS1. Trzeba będzie zrobić max na podciągu:

MAX(CAST(SUBSTRING(courseid FROM 4) AS UNSIGNED)) 
+4

nadal będzie ciągiem znaków, chociaż ... powinien być w stanie obsłużyć go przez dodanie 0, czyli MAX (SUBSTRING (courseid FROM 4) +0) – Orangepill

+0

, który też działa :) – Orangepill

+1

Jeśli identyfikator kursu nie jest przewidywalny w formacie, zawsze możesz załadować wszystko do tablicy php i wykonaj polecenie natsort. – Orangepill

0

Zastosowanie:

SELECT MAX(CAST(SUBSTRING(courseid,4) AS UNSIGNED)) 
FROM tblcourse 
WHERE courseid LIKE '%JAS%' 
1

Wiele czystych rozwiązań sql gdzie pod warunkiem, że powinien działać na założeniu, że wszystkie kursy są formatowane z trzech przedrostek znaków, po którym następują liczby. Chciałem rzucić się z rozwiązaniem php.

Najpierw zdobądź wszystkie kursy pasujące do Twojej klauzuli "jak" w tablicy.

$matching = array(); 
while ($matching[] = $query->fetchNext()){} 

Następnie

natsort($matching); 
$last = end($matching); 

Ostatni zawierać będzie ostatnią JAS10000 w Twoim przypadku

+0

A jeśli jest 10 miliardów wpisów? Sugerujesz skopiowanie wszystkich danych do pamięci RAM? DLA KAŻDEGO równoległego uruchomienia skryptu? –

+0

@maximkumpan Nie przypominam sobie o tym, po prostu ilustruję, że drugi to nazwa kursu QAMS0015, wszystkie inne rozwiązania upadają, i że to może być opłacalna alternatywa. – Orangepill

+1

Wezmę powolny i właściwy dzień nad szybko i źle każdego dnia. – Orangepill