2013-07-10 21 views
5

ho difficoltà cercando di recuperare max courseidmySQL max() non tornare risultato max

dati:

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

Query:

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

simili è di restringere a courseid che iniziare con JAS.

La query restituisce solo JAS9999 come risultato massimo ma il numero di corso massimo è JAS10000. Mi sto perdendo qualcosa?

+1

Corsi che ___begin___ con 'JAS' dovrebbe essere come' 'JAS%' '... corsi che ___contain___' JAS' sarebbe LIKE ''% JAS%'' –

risposta

6

Non è possibile eseguire MAX su numeri incorporati in testo come questo. Fa ordine alfabetico e quindi JAS9 va dopo JAS1. Si dovrà fare max su una stringa:

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

sarà ancora una stringa però ... dovrebbe essere in grado di lanciarlo aggiungendo 0 cioè MAX (SUBSTRING (courseid DA 4) +0) – Orangepill

+0

che funziona anche :) – Orangepill

+1

Se l'id del corso non è prevedibile nel formato, puoi sempre caricare tutto in un array php e fare un natsort. – Orangepill

0

Usa:

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

Un sacco di soluzioni SQL puri ove previsto che dovrebbe funzionare sul presupposto che tutti i corsi sono formattato con un tre prefisso del carattere seguito da numeri. Io pensavo di buttarmi dentro con una soluzione php.

Prima ottenere tutti i corsi che corrispondono alla tua clausola come in un array.

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

Poi

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

Ultimo conterrà l'ultima JAS10000 nel tuo caso

+0

E se ci sono 10 miliardi di voci? Suggerisci di copiare tutti quei dati nella RAM? Per OGNI esecuzione concorrente della sceneggiatura? –

+0

@maximkumpan Non ricordo di averlo detto, stavo solo illustrando che nel secondo c'è un nome di corso QAMS0015 tutte le altre soluzioni cadono, e che questa potrebbe essere una valida alternativa. – Orangepill

+1

I'll take slow and right over fast and wrong any day – Orangepill