[MySQL] order by descending werkt niet

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

  • xantos
  • Registratie: Juni 1999
  • Niet online
In mijn MySQL database (versie 5.0.32) heb ik de volgende tabel:

bedrag_waarde
bedrag_id - VARCHAR(50)
geldig_vanaf - DATE
groep_id - TINYINT(3)
waarde - VARCHAR(40)
commentaar VARCHAR(100)

Deze tabel bevat onder andere het volgende record:
'VV2000_334d_b_c_verlenging_gezinslid', '2005-07-01', 146, '€ 52,00', 'stc2005-124-019'

Nu komt het...

Bij het uitvoeren van de volgende query krijg ik netjes resultaat

code:
1
2
3
4
SELECT *
FROM bedragen.bedrag_waarde 
WHERE bedrag_id = 'VV2000_334d_b_c_verlenging_gezinslid'
ORDER BY geldig_vanaf asc


De volgende query geeft echter geen resultaat

code:
1
2
3
4
SELECT *
FROM bedragen.bedrag_waarde 
WHERE bedrag_id = 'VV2000_334d_b_c_verlenging_gezinslid'
ORDER BY geldig_vanaf desc


Het enige verschil is dat er nu descending gesorteerd wordt. Wie of wie kan mij vertellen waarom dit niet werkt?

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Kijk je of er output komt met een MySQL-client als de commandline-tool of phpMyAdmin, of heb je er zelf wat omheen gescript/geprogrammeerd? Bij zo'n eenvoudige query is de kans groter dat je zelf ergens een typo maakt of wat over het hoofd ziet, dan dat MySQL dat fout doet.

  • xantos
  • Registratie: Juni 1999
  • Niet online
Speciaal voor jou heb ik dit nog eens op de commandline geprobeerd...

code:
1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT * FROM bedragen.bedrag_waarde WHERE bedrag_id = 'VV2000_334d_b_c_verlenging_gezinslid' ORDER BY geldig_vanaf asc;
+--------------------------------------+--------------+----------+---------+-----------------+
| bedrag_id                            | geldig_vanaf | groep_id | waarde  | commentaar      |
+--------------------------------------+--------------+----------+---------+-----------------+
| VV2000_334d_b_c_verlenging_gezinslid | 2005-07-01   |      146 |  52,00 | stc2005-124-019 |
+--------------------------------------+--------------+----------+---------+-----------------+
1 row in set (0.00 sec)


mysql> SELECT * FROM bedragen.bedrag_waarde WHERE bedrag_id = 'VV2000_334d_b_c_verlenging_gezinslid' ORDER BY geldig_vanaf desc;
Empty set (0.00 sec)

  • Miky-Man
  • Registratie: Juli 2007
  • Laatst online: 27-11 19:52
Probeer es desc in hoofdletters, dus DESC

Desktop CPU: 3.40GHz | RAM: 2GB | HDD: 400GB | Display: 21" | OS: Windows XP
Laptop CPU: 120MHz | RAM: 16MB | HDD: 1,6GB | Display: 6.1" TFT | OS: n/a


  • xantos
  • Registratie: Juni 1999
  • Niet online
Mijn collega vroeg me eens 'having' te gebruiken in plaatst van 'where'. 8)7 8)7 8)7

code:
1
2
3
4
SELECT *
FROM bedragen.bedrag_waarde
having bedrag_id = 'VV2000_334d_b_c_verlenging_gezinslid'
ORDER BY geldig_vanaf desc


en dit werkt wel. Hoe kan dit?

  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 07:17
Heb je ook een database dump? Op basis van jou gegevens kan ik het niet reproduceren.

  • xantos
  • Registratie: Juni 1999
  • Niet online
Ik denk dat ik het probleem gevonden heb. Er zitten een aantal 0000-00-00 datums in en bovendien een ongeldige datum 0206-10-01. Ik ga deze corrigeren en hierna de validatie eens bekijken.

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 27-11 10:50

_Thanatos_

Ja, en kaal

Ja, fijn is dat, ongeldige datums. Maar in pincipe zou sorteren dat niet in de weg mogen zitten... Sorteren op een datum is niet anders dan sorteren op een getal, tenslotte.

Ohja, en wel ff uitzoeken hoe die ongeldige datums er in eerste instantie in konden komen he ;)

日本!🎌


  • xantos
  • Registratie: Juni 1999
  • Niet online
Nee, het ligt niet aan de ongeldige datums. Het probleem doet zich nog steeds voor. Ik zal dadelijk even een dumpje online zetten met deze tabel incl records..

  • xantos
  • Registratie: Juni 1999
  • Niet online
Ok, de dump-file is hier te vinden...

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Zeer merkwaardig, het heeft te maken met de primary key. Wanneer ik die drop of de volgorde van de velden omdraai, werkt de query wel goed (MySQL 5.0.41).

[ Voor 5% gewijzigd door GlowMouse op 10-07-2007 13:46 ]


  • xantos
  • Registratie: Juni 1999
  • Niet online
En als je een deel van de overige records dropt dan gaat het ook goed. Een "order by" voor alle records gaat ook goed.

Het lijkt erop dat het misgaat als een bedrag_id maar één record heeft. Bij meerdere gaat het wel goed. Al zijn er ook bedrag_id's met één record waar het goed gaat. :'( :'(

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 24-11 23:24

BikkelZ

CMD+Z

Dit lijkt meer op een MySQL bugje, maar er moet toch iets speciefieks in je tabellen zitten (die query is in de verste verte niet exotisch te noemen) wat het triggert, en het is niet alleen de primary key.

iOS developer


  • xantos
  • Registratie: Juni 1999
  • Niet online
Hopelijk is er nog iemand met een slim idee.. Ik zie echt niet wat er aan de hand is. :?

  • Icelus
  • Registratie: Januari 2004
  • Niet online
Het lijkt wat op deze bug.
Je zou, zoals daar wordt aangegeven, kunnen proberen om de primary key in een unique te veranderen.

Developer Accused Of Unreadable Code Refuses To Comment


  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 07:17
Bizar genoeg werkt het wel als je het veld 'geldig_vanaf' naar DATETIME omzet.

Probeer:
code:
1
2
3
4
SELECT * 
FROM bedrag_waarde 
WHERE bedrag_id = 'VV2000_334d_b_c_verlenging_gezinslid' 
ORDER BY CAST(geldig_vanaf AS DATETIME) ASC;


Dus pas eens het datatype aan in de tabeldefinitie?

Kan zo gauw niet vinden wat hier de de grote gedachte achter is. Mijn mysql server is 5.0.

  • xantos
  • Registratie: Juni 1999
  • Niet online
Ja die MySQL bug lijkt hier sterk op. Ik heb net een upgrade gedaan naar versie 5.0.41-1 maar helaas zonder resultaat. ;(

De omschrijving van de bug klopt wel enigzins. Als ik van de primary-key een 'char(50)' maak in plaats van een varchar(50) dan werkt het wel. Ik zal er ook eens een datetime van maken.

Lijkt erop dat deze bug dus nog niet helemaal is opgelost.

  • Icelus
  • Registratie: Januari 2004
  • Niet online
xantos schreef op woensdag 11 juli 2007 @ 09:25:
Lijkt erop dat deze bug dus nog niet helemaal is opgelost.
Je zou dit nog als bugreport kunnen melden. Waarschijnlijk is het een variant en eenvoudig te verhelpen (voor toekomstige versies).

Developer Accused Of Unreadable Code Refuses To Comment


  • xantos
  • Registratie: Juni 1999
  • Niet online
Ik ga 'm meteen melden!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Ik kan het niet laten: Is het niet handig om nogmaals over het datamodel na te denken?
De naam van de kolom bedrag_id strookt imo niet met de waarden die erin staan. Het lijkt meer op de beschrijving van een bepaalde wet/richtlijn/regel. Is het dan niet handig om een extra tabel 'Regels' te maken welke een synthetische key heeft (auto-increment kolommetje) en de kolom bedrag_id te vervangen door regel_id?
Voordelen: minder redundantie en primary key fixed length met gunsitger datatypes. En als cadeautje heb je dan meteen geen last meer van deze bug. :)

{signature}


  • xantos
  • Registratie: Juni 1999
  • Niet online
Voutloos schreef op woensdag 11 juli 2007 @ 10:05:
Ik kan het niet laten: Is het niet handig om nogmaals over het datamodel na te denken?
De naam van de kolom bedrag_id strookt imo niet met de waarden die erin staan. Het lijkt meer op de beschrijving van een bepaalde wet/richtlijn/regel. Is het dan niet handig om een extra tabel 'Regels' te maken welke een synthetische key heeft (auto-increment kolommetje) en de kolom bedrag_id te vervangen door regel_id?
Voordelen: minder redundantie en primary key fixed length met gunsitger datatypes. En als cadeautje heb je dan meteen geen last meer van deze bug. :)
Ja, dat is zeker handig, alleen nu even niet. Er maken meerdere applicaties gebruik van deze tabel(len) en ik heb even niet de tijd om deze aan te passen. Toch bedankt voor de tip. ;)
Pagina: 1