MySQL laatste 30 sorteren

Pagina: 1
Acties:

  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
Voor mijn website wil ik de laatste 30 toegevoegde records op kunnen vragen maar deze 30 moeten ook gesorteerd kunnen worden.

dus:
- laaste 30 selecteren
- sorteeren op gewenste kolom

Omdat de LIMIT functie ná de ORDER BY functie geplaats moet worden is dit dus niet mogenlijk in één query. Mijn volgende idee was dus een subquery. Deze heb ik ook gemaakt:
SQL:
1
2
3
4
5
SELECT * FROM (SELECT `id`, `titel`, `medium`, `locatie`, `positie`, DATE_FORMAT(`adddate`,'%e-%c-%Y') AS datum 
                 FROM `titels` 
                 WHERE `adddate` >= date_sub(NOW(), INTERVAL 7 DAY)
                 ORDER BY `adddate` DESC LIMIT 30) AS virtual_table
ORDER BY `colnaam`;

Deze werkt prima, alleen de mysql versie van mijn webhost is te laag en ondersteund geen subquery's.
Ik wil het graag in één query doen alleen ik zou niet weten hoe dat moet zonder subquery's.

Iemand een idee?

[ Voor 3% gewijzigd door Face_-_LeSS op 10-07-2005 23:26 ]


  • kmf
  • Registratie: November 2000
  • Niet online

kmf

SELECT `id`, `titel`, `medium`, `locatie`, `positie`, DATE_FORMAT(`adddate`,'%e-%c-%Y') AS datum
FROM `titels`
WHERE `adddate` >= date_sub(NOW(), INTERVAL 7 DAY)
ORDER BY `adddate`, `colnaam` DESC LIMIT 30

One thing's certain: the iPad seriously increases toilet time.. tibber uitnodigingscode: bqufpqmp


  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
athlonkmf schreef op zondag 10 juli 2005 @ 23:31:
SELECT `id`, `titel`, `medium`, `locatie`, `positie`, DATE_FORMAT(`adddate`,'%e-%c-%Y') AS datum
FROM `titels`
WHERE `adddate` >= date_sub(NOW(), INTERVAL 7 DAY)
ORDER BY `adddate`, `colnaam` DESC LIMIT 30
Helaas werkt dit niet, dit heb ik al geprobeerd. Nu wordt er eerst op datum gesorteerd(het is een timestamp dus data zijn nooit het zelfde omdat het invoeren altijd wat tijd kost) vervolgens wordt er op colnaam gesorteerd, bijvoorbeeld `titel`, maar omdat er geen dezelfde data in staan zal er niet veel veranderen.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Misschien met een temptable?
For more complicated subqueries, you can often create temporary tables to hold the subquery.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • NoFearWizz
  • Registratie: Oktober 2002
  • Laatst online: 05-05 10:43
Heb je al gedacht aan een:

'Group by' , 'Having' methode???

  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
NoFearWizz schreef op maandag 11 juli 2005 @ 00:08:
Heb je al gedacht aan een:

'Group by' , 'Having' methode???
Zojuist over na gedacht en de manual van MySQL er bij gehaald voor uitleg over die functies maar ik zie niet hoe ik het toe kan passen om het gewenste resultaat te krijgen.

Ben nu met temporary tables bezig, hopen dat ik het voor elkaar krijg.

Sugesties nogsteeds welkom :)

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

NoFearWizz schreef op maandag 11 juli 2005 @ 00:08:
Heb je al gedacht aan een:

'Group by' , 'Having' methode???
Leuk dat je die aanhaalt, maar ik zie niet hoe je ze kan toepassen. Heb je er zelf dus over nagedacht? ;)

Ik gok dat in dit geval de temporary table een van de weinige mogelijkheden is (create temporary table sorter as select ... from ... where ... order by adddate desc limit 30 en daarna select ... from sorter order by ...)

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Bij het gebruik van een temptable, zou ik de id's in de temptable invoegen, en dan de query die je wilt inner joinen met deze temptable. Scheelt altijd weer een beetje ten opzichte van de hele query in een temptable zetten.

Ik denk inderdaad ook dat een temptable de enige oplossing is.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

P_de_B schreef op maandag 11 juli 2005 @ 08:07:
Bij het gebruik van een temptable, zou ik de id's in de temptable invoegen, en dan de query die je wilt inner joinen met deze temptable. Scheelt altijd weer een beetje ten opzichte van de hele query in een temptable zetten.
Maar als je het hele resultaat erin gooit hoef je niet meer te joinen, en dat is waarschijnlijk nog veel sneller ;)

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Misschien inderdaad met 30 records wel, maar ik zou verwachten dat bij een grote resultset het wel sneller zou gaan met de join manier. Zal gerommel in de marge zijn, maar ik zou zeggen dat File I/O op een grote set zwaarder zou zijn dan de join.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
Ok, dan ga ik het met temp tables proberen.

Alleen is het mogenlijk om in één query
- de table te maken
- de gewenste resultaten in die temp table te zetten
- alles uit de temp table te selecteren en dat te sorteren op colnaam

Volgens mij niet maar ik vraag het even. Dat was namelijk mijn bedoeling om het gewenste resultaat in één query terug te krijgen.

dit heb ik nu:
SQL:
1
2
3
4
5
CREATE TEMPORARY TABLE TempTable AS
SELECT `id`, `titel`, `medium`, `locatie`, `positie`, DATE_FORMAT(`adddate`,'%e-%c-%Y') AS datum
FROM `titels` 
WHERE `adddate` >= date_sub(NOW(), INTERVAL 7 DAY)
ORDER BY `adddate` DESC LIMIT 30;
en
SQL:
1
SELECT * FROM TempTable ORDER BY `titel` DESC;


Deze 2 query's zijn niet samen te voegen zeker?

Verwijderd

Klikt mss heel suf ?

Maar als je id automatisch optelt, kun je toch zeg maar de laatste 30 ophalen sorted by id desc, en dan de kolom titel ?

dus iets als:

SQL:
1
SELECT * FROM `titels` ORDER BY id DESC, [je kolomding] LIMIT 30;


zoiets?

Maar dan moet je wel je queries chronologisch toevoegen...

[ Voor 11% gewijzigd door Verwijderd op 11-07-2005 14:46 ]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Face_-_LeSS schreef op maandag 11 juli 2005 @ 12:48:
Alleen is het mogenlijk om in één query
- de table te maken
- de gewenste resultaten in die temp table te zetten
- alles uit de temp table te selecteren en dat te sorteren op colnaam
In MySQL niet, die kan niet meerdere statements per query-string uitvoeren.
SQL:
1
2
3
4
5
CREATE TEMPORARY TABLE TempTable AS
SELECT `id`, `titel`, `medium`, `locatie`, `positie`, DATE_FORMAT(`adddate`,'%e-%c-%Y') AS datum
FROM `titels` 
WHERE `adddate` >= date_sub(NOW(), INTERVAL 7 DAY)
ORDER BY `adddate` DESC LIMIT 30;
en
SQL:
1
SELECT * FROM TempTable ORDER BY `titel` DESC;


Deze 2 query's zijn niet samen te voegen zeker?
Nee, tenzij je dus een MySQL-versie met subquery-ondersteuning hebt

  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
ACM schreef op maandag 11 juli 2005 @ 15:42:
[...]

In MySQL niet, die kan niet meerdere statements per query-string uitvoeren.

[...]

Nee, tenzij je dus een MySQL-versie met subquery-ondersteuning hebt
Hmm, daar was ik al bang voor. Het worden dus toch 2 query's.
In ieder geval bedankt!

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 30-04 09:28

Macros

I'm watching...

Je kan ook de 'client' de data laten sorteren. Scheelt weer een query.

"Beauty is the ultimate defence against complexity." David Gelernter


  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
Ja, klopt. Zou kunnen alleen het is een site die ik vooral zelf ga gebruiken en zal niet veel hits krijgen dus het maakt niet echt uit.

  • Gwaihir
  • Registratie: December 2002
  • Niet online
Macros schreef op maandag 11 juli 2005 @ 16:32:
Je kan ook de 'client' de data laten sorteren. Scheelt weer een query.
Maar databaservers zijn daar juist zo verrekte goed in.. er zijn weinig clients die dat sneller kunnen.
Pagina: 1