2013-05-11 10 views
7

Powiedzmy, że mam tabeli, która zawiera kolumnę numer faktury, typ danych jest VARCHAR z mieszanymi wartości ciąg/int jak:Jak wybrać maks. Kolumnę mieszanych ciągów/int?

invoice_number 
************** 
    HKL1 
    HKL2 
    HKL3 
    ..... 
    HKL12 
    HKL13 
    HKL14 
    HKL15 

starałem się wybrać max, ale to wraca z " HKL9 ", nie najwyższa wartość" HKL15 ".

SELECT MAX(invoice_number) 
FROM `invoice_header` 

Odpowiedz

16

HKL9 (string) jest większa niż HKL15, ponieważ są one porównywane jako łańcuchy. Jednym ze sposobów rozwiązania problemu jest zdefiniowanie funkcji kolumny, która zwraca tylko numeryczną część numeru faktury.

Jeśli wszystkie numery faktur zacząć HKL, wówczas można użyć:

SELECT MAX(CAST(SUBSTRING(invoice_number, 4, length(invoice_number)-3) AS UNSIGNED)) FROM table 

Zajmuje INVOICE_NUMBER Wyłączając 3 pierwszych znaków, konwertuje do int i wybiera z niego max.

+0

Dziękuję @nakosspy, ale jak mogę to zrobić za pomocą php/mysql? – CairoCoder

+0

Instrukcja jest standardowym językiem SQL. Możesz go wykonać jak każde inne zdanie. – nakosspy

+0

Mam to, to: WYBIERZ max (podłańcuch (numer_ faktury, 4, długość (numer_ faktury) -3)) Z tabeli – CairoCoder

2

Twój problem jest bardziej jeden z definicji projektu &.

Wybierz numer faktury z najwyższym ID lub data, lub - jeśli te naprawdę nie korelują z „najwyższej numer faktury” - określić dodatkowe kolumny, która koreluje z faktury-liczbowa, wystarczająco prosty, aby zrozumieć słabą bazę danych.

select INVOICE_NUMBER 
from INVOICE_HEADER 
order by ID desc limit 1; 

Nie chodzi o to, że baza danych nie jest wystarczająco inteligentna ... chodzi o to, że zadajesz niewłaściwe pytanie.

+0

Dzięki @Thomas W, ale jak powinienem o to poprosić, jeśli pytam w niewłaściwy sposób? – CairoCoder

+1

Myślę, że to także zamówienie według opisu. – CairoCoder

+0

Faktura o najwyższym numerze powinna być najnowszą; według ID lub według daty. Nie należy oczekiwać, że bazy danych będą dekodować arbitralne ciągi znaków, ale naprawdę szybko wykonują skanowanie indeksu klucza podstawowego :) –

4

wybrać IFNULL (max (konwersja (INVOICE_NUMBER liczba całkowita ze znakiem)), 0) z invoice_header gdzie INVOICE_NUMBER REGEXP '^ [0-9] + $'

+0

Jest to jedyna poprawna odpowiedź tutaj, ponieważ działa nawet wtedy, gdy numery faktur mają różne formaty i działa bez modyfikacji baza danych. – Vincent

1

powinno działać również

SELECT invoice_number 
FROM invoice_header 
ORDER BY LENGTH(invoice_number) DESC,invoice_number DESC 
LIMIT 0,1 
1

Po chwili poszukiwań znalazłem najłatwiejsze rozwiązanie tego.

select MAX(CAST(REPLACE(REPLACE(invoice_number , 'HKL', ''), '', '') as int)) from invoice_header 
Powiązane problemy