[SQL] 9 is de maximale waarde ipv 10?

Pagina: 1
Acties:
  • 175 views sinds 30-01-2008
  • Reageer

  • Johnny
  • Registratie: December 2001
  • Laatst online: 22-08 21:11

Johnny

ondergewaardeerde internetguru

Topicstarter
De omschrijvingen van de foto's staan in een database, voor een website, met PHP.

Series foto's staan in aparte mappen (galerijen), de juiste beschrijving voor iedere wordt foto verbonden door het NAME veld wat een VARCHAR is.

De foto's hebben namen 1.jpg, 2.jpg, 3.jpg enz. Het NAME veld bevat waarden zoals 1, 2, 3 enz. De rij waar de omschrijving van de galerij in staat heeft "index" in het NAME veld, deze wordt dus uitgesloten.

Om te bepalen met welke naam de volgende foto moet worden opgeslagen moet de naam van de laatste foto uit de database worden gehaald (niet tellen, want als er later een foto verwijderd wordt gaat het mis). En vervolgens wordt daar 1 bij opgteld.

Ik dacht dit even simpel op te lossen door MAX() te gebruiken. Alles ging goed totdat ik bij foto 10 aankwam. Hij blijft iedere foto na de negende "10" noemen omdat de query "9" iedere keer als maximale waarde geeft terwijl dat dus "10" zou moeten zijn.

Hoe moet ik dat nu oplossen?

PHP:
1
$query = "SELECT MAX(name) FROM photos WHERE gallery='$gallery' AND name != 'index'";


Komt het omdat het een VARCHAR veld is in plaats van een INT? Dat veranderen zou me heelw at tijd kosten... Dat doe ik dus liever niet.

[ Voor 5% gewijzigd door Johnny op 10-05-2003 23:53 ]

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

9 komt na de 10, alfabetisch gezien? En aangezien je een varchar gebruikt, sorteer je alfabetisch.

[ Voor 62% gewijzigd door gorgi_19 op 10-05-2003 23:58 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Laszlo
  • Registratie: Februari 2000
  • Laatst online: 22-08-2024

Laszlo

Grrrrrr....

ja, het komt idd, omdat je het een varchar hebt gemaakt en geen int/number. Misschien zou je het kunnen proberen met waarden zoals 00001, 00002, 00003, etc.

Maar eigenlijk, zoals je al aangaf, zou het type moeten veranderen in int/number. ;)

specs


  • Johnny
  • Registratie: December 2001
  • Laatst online: 22-08 21:11

Johnny

ondergewaardeerde internetguru

Topicstarter
Ik bedacht net tijdens het tandenpoetsen een andere workaround:
Neem de maximale ID van die galerij en haal dan de waarde uit het NAME veld. Maar hoe doe ik dat?

PHP:
1
2
3
4
5
6
7
8
9
10
11
//pak de maximale ID van de galerij

$query = "SELECT MAX(id) FROM photos WHERE gallery='$gallery' AND name != 'index'";
$result = mysql_query ($query,$db);
$rows = mysql_fetch_row ($result);

//neem de waarde uit het NAME veld van de rij met het eerder gevonden ID

$query = "SELECT name FROM photos WHERE id='$rows[0]'";
$result = mysql_query ($query,$db);
$imgname = mysql_fetch_object($result);


Zou ik dit met een enkele query kunnen oplossen?

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Een tussenoplossing zou zijn om zoiets te doen:
SQL:
1
SELECT MAX(CAST(name AS int)) FROM photos WHERE blabla

Je geeft niet aan welke database-server je gebruikt, maar in MSSQL werkt dit, dus in de jouwe misschien ook wel ;)

/edit
jaaa, nu opeens laat je doorschemeren dat je MySQL gebruikt. Wil je dat de volgende keer gelijk aangeven?

[ Voor 20% gewijzigd door _Thanatos_ op 11-05-2003 00:32 ]

日本!🎌


  • Johnny
  • Registratie: December 2001
  • Laatst online: 22-08 21:11

Johnny

ondergewaardeerde internetguru

Topicstarter
_Thanatos_ schreef op 11 mei 2003 @ 00:30:
Een tussenoplossing zou zijn om zoiets te doen:
SQL:
1
SELECT MAX(CAST(name AS int)) FROM photos WHERE blabla

Je geeft niet aan welke database-server je gebruikt, maar in MSSQL werkt dit, dus in de jouwe misschien ook wel ;)

/edit
jaaa, nu opeens laat je doorschemeren dat je MySQL gebruikt. Wil je dat de volgende keer gelijk aangeven?
MySQL ondersteunt helaas maar BINARY, DATE, DATETIME, SIGNED {INTEGER}, TIME, UNSIGNED {INTEGER} em geen INT bij de CAST() functie.

Of bedoelen ze dat met (un)signed {integer}?

De ranzige oplossing met de twee queries werkt in ieder geval wel nu, ik kan weer rustig slapen.

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


  • nescafe
  • Registratie: Januari 2001
  • Nu online
Ik geef je twee hints: order by en limit
Johnny schreef op 11 May 2003 @ 00:29:
PHP:
1
2
$query = "SELECT MAX(id) FROM photos WHERE gallery='$gallery' AND name != 'index'";
$query = "SELECT name FROM photos WHERE id='$rows[0]'";
Ja, wat is Id nou voor veld? Numeriek of tekst?

[ Voor 80% gewijzigd door nescafe op 11-05-2003 11:31 ]

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


  • intGod
  • Registratie: Maart 2003
  • Niet online

intGod

Ars non postulat causam

Als je niet wil converteren:

select max(right"0000000000" + id, 10)

levert je altijd een getal met 10 posities gepad met leading zeroes.

Verwijderd

Waarom maak je er geen int van? Kun je met een ander attribute instellen of het een index is. Is denk ik een betere manier dan zo'n smerige workaround.
Pagina: 1