[MySQL] max() op veld met tekst en nummer (bv. ABC30056)

Pagina: 1
Acties:

  • klaaz
  • Registratie: April 2000
  • Laatst online: 24-04 16:54

klaaz

it's me!

Topicstarter
Ik ben bezig met een PHP website waarin ik bestaande MySQL tabellen moet gebruiken. De login van bezoekers bestaat uit een string met 3 letters + volgnummer (bv. ABC30056)

Die letters hebben een betekenis en moeten gehandhaafd blijven, de opvolgende nummers moeten opgehoogd worden wanneer er een bezoeker wordt toegevoegd.

Nu is het simpel om bijvoorbeeld de hoogste waarde van een numeriek veld in een tabel te vinden, maar op dit veld met letters en cijfers stuit ik toch op enkele problemen.

Ik heb van alles geprobeerd, o.a.
code:
1
2
3
SELECT * 
FROM `tabel` 
WHERE LEFT( login, 3 ) = 'ABC' and MAX(SUBSTRING(login, 4,5))

Dit werkt echter niet (invalid use of group function)

Ik kan natuurlijk ook dit doen:
code:
1
2
3
SELECT * 
FROM `tabel` 
WHERE LEFT( login, 3 ) = 'ABC' ORDER BY login DESC LIMIT 0 , 1

En dan het numerieke gedeelte eruit vissen en voor de insert met 1 ophogen, maar dat lijkt me op de een of andere manier niet betrouwbaar. ;)

Iemand ideeën?

[ Voor 4% gewijzigd door klaaz op 03-12-2003 14:58 ]


  • Bubbaman
  • Registratie: Juli 2003
  • Laatst online: 20-03-2022
Niet zo heel moeilijk...

Maak een "auto increment" veld aan (int 4). Deze gaat vanaf de aangegeven beginwaarde steeds met 1 ophogen.

Maak een nieuw veld (bijv. klantnummer), en vul deze met de inhoud van je veld ABC en het auto increment veld (gewoon met substr().

Rob

[ Voor 3% gewijzigd door Bubbaman op 03-12-2003 15:01 ]


  • klaaz
  • Registratie: April 2000
  • Laatst online: 24-04 16:54

klaaz

it's me!

Topicstarter
Bubbaman schreef op 03 december 2003 @ 15:00:
Niet zo heel moeilijk...

Maak een "auto increment" veld aan (int 4). Deze gaat vanaf de aangegeven beginwaarde steeds met 1 ophogen.

Maak een nieuw veld (bijv. klantnummer), en vul deze met de inhoud van je veld ABC en het auto increment veld (gewoon met substr().
Rob
Klaaz schreef op 03 december 2003 @ 14:55:
Ik ben bezig met een PHP website waarin ik bestaande MySQL tabellen moet gebruiken.
Let vooral op het woordje moet ;)

M.a.w ik mag de tabellen niet veranderen. Er word nml ook door andere systemen in gelezen en geschreven.

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 31-03 15:20
Uit je post is het me niet helemaal duidelijk of je overall het hoogste volgnummer wilt hebben, of alleen het hoogste nummer van die logins die met 'abc' beginnen. Maakt op zich niet uit. In het eerste geval gebruik je:
SQL:
1
SELECT MAX(SUBSTRING(login, 4,5)) FROM tabel
en in het tweede geval:
SQL:
1
SELECT MAX(SUBSTRING(login, 4, 5)) FROM tabel WHERE LEFT(login, 3) = 'ABC'

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 22:07

JaQ

kan je niets met een natural sort? (als ik me niet vergis is dat namelijk wat je zoekt, of sla ik nu compleet de plank mis?) Ik gebruik voor dit soort dingen altijd deze draak en doe pak dan enkel het eerste record:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    /**
    * keySort - sort a multidimensional array
    *
    * keysort sorts a multidimensional array based
    * on one of it's keys.
    *
    * @param    array   $array  The array to sort
    * @param    string  $key    The key to sort on
    * @param    boolean $reverse    optional reverse flag.
    *                           sort is done in reverse order
    *                           if this parameter is set to
    *                           TRUE.
    * @return   array   $array  The resulting sorted array
    *
    * @access   public
    */
    function keySort($array, $key, $reverse = FALSE)
    {
        $ord = 1;
        if ($reverse === TRUE)
        {
            $ord = -1;
        }

        $cmp=create_function('$a, $b', "return $ord * strnatcmp(\$a['$key'], \$b['$key']);");
        uasort($array, $cmp);
        reset($array);

        return $array;
    }


maar die sorteerd je hele array (nogal vervelend als er veel data in staat). Er is voor zover ik weet echter geen mysql equivalent (maar zo goed ken ik mysql nou ook weer niet).

Egoist: A person of low taste, more interested in themselves than in me


  • klaaz
  • Registratie: April 2000
  • Laatst online: 24-04 16:54

klaaz

it's me!

Topicstarter
bigtree schreef op 03 december 2003 @ 20:17:
Uit je post is het me niet helemaal duidelijk of je overall het hoogste volgnummer wilt hebben, of alleen het hoogste nummer van die logins die met 'abc' beginnen. Maakt op zich niet uit. In het eerste geval gebruik je:
SQL:
1
SELECT MAX(SUBSTRING(login, 4,5)) FROM tabel
en in het tweede geval:
SQL:
1
SELECT MAX(SUBSTRING(login, 4, 5)) FROM tabel WHERE LEFT(login, 3) = 'ABC'
Perfect. Dit is het, zo simpel dat ik er zelf niet eens opgekomen ben... ;)

Dank je.
Pagina: 1