[SQL] Minimaal aantal records

Pagina: 1
Acties:

  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 06-09-2025

Zenda

goes milk!

Topicstarter
Hallo iedereen!

Ik ben bezig met een CMS. De CMS kant is zo goed als af en ik ben nu bezig met de voorkant.

In de CMS kun je instellen dat hij automatisch berichten archiveert. Als je dit hebt aanstaan, kun je ook kiezen na hoeveel dagen de berichten worden gearchiveerd. Je kunt ook instellen hoeveel er minimaal getoond moeten worden.

Ik heb een query als deze:
code:
1
2
3
4
5
6
7
8
SELECT 
title
, message
, DATE_FORMAT(postdate, '%d.%m.%Y %H:%i') as showdate 
FROM
tabel_naam
WHERE
postdate >= NOW()-$arch_na_x_dagen
Nu wil ik dus wel dat hij altijd 10 berichten laat zien, ongeacht of het bericht nu kleiner is dan NOW() - $arch_na_x_dagen of niet.

Om het in SQL mensentaal uit te leggen:
code:
1
2
3
4
5
6
7
8
9
SELECT
title
, message
, DATE_FORMAT(postdate, '%d.%m.%Y %H:%i') as showdate 
FROM
tabel_naam
WHERE
postdate >= NOW()-$arch_na_x_dagen
Maar toon altijd 10 berichten
Ik ben (nog) niet een ster in SQL maar zou graag wat bijleren. Weet iemand misschien hoe dit te maken?

Zenda likes some milk every now and then..


Verwijderd

Maak van die WHERE clause een ORDER BY clause, en voeg een LIMIT 0, 10 clause toe.

Verwijderd

Hmja, in een fatsoenlijke db zou dit bijvoorbeeld kunnen met een simpele union:

code:
1
2
3
4
5
6
7
SELECT m.title, m.message, ...,
FROM message m
WHERE id IN (
    (SELECT id FROM message ORDER BY postdate DESC LIMIT 10)
    UNION
    (SELECT id FROM message WHERE postdate >= $a)
)

Ik geloof niet dat dit in 1x kan in mysql, dus zul je wat tijdelijk in php op moet slaan ofzo.

Als ik je overigens iets mag aanraden: gebruik postgresql ipv mysql :)

@hieronder/hierboven: Volgens mij is het niet helemaal de bedoeling om altijd maximaal 10 results te verkrijgen, maar gewoon alle records binnen de archive_time, enkel als dit er minder zijn dan 10, alsnog de 10 recentste records te gebruiken.

[ Voor 20% gewijzigd door Verwijderd op 15-10-2006 23:13 ]


  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 06-09-2025

Zenda

goes milk!

Topicstarter
hmm.. right :) oke..

ik doe het wel met twee queries :)

Zenda likes some milk every now and then..


  • GlowMouse
  • Registratie: November 2002
  • Niet online
Zenda schreef op zondag 15 oktober 2006 @ 22:18:
hmm.. right :) oke..

ik doe het wel met twee queries :)
Cheatah geeft toch de oplossing? :?

Verwijderd

De oplossing van Cheatah is de juiste, een union zoals emiel suggereert kost je schadalig veel resources en is niet netjes.

  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 12-02 07:48

pietje63

RTFM

Verwijderd schreef op zondag 15 oktober 2006 @ 22:26:
De oplossing van Cheatah is de juiste, een union zoals emiel suggereert kost je schadalig veel resources en is niet netjes.
Bij de oplossing van Cheetah krijg je maximaal 10 berichten uit de laatste x dagen

Wat de TS (volgens mij wil)
Alle berichten uit de laatste x dagen EN in totaal minimaal 10

Ik denk dat 2 simpele queries hier ook het slimste is. De tweede kun je makkelijk opbouwen (datum ouder dan x dagen en limit y,10-y waar y het mysql_num_records van de eerste query is).

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


  • Paul
  • Registratie: September 2000
  • Nu online
Ik denk dat een SELECT Count naar alles binnen de archiefdatum, gevolgd door een "select order by limit" (waarbij de limit de hoogste van de select count en 10 is) het simpelste is.

Ik weet niet wat duurder is, limit of where, maar als de limit duurder is dan de where zou je de 2e query afhankelijk kunnen laten zijn van het antwoord uit de eerste, dus limit 10 zonder where of where post < archief.

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 06-09-2025

Zenda

goes milk!

Topicstarter
Late reply nog, maar zoals Pietje63 het omschrijf is het. Ik heb het nu dus als volgt opgelost:

code:
1
<? if (mysql_num_rows($res) < $minimal_msgs) { // nog een query } ?>

Zenda likes some milk every now and then..


  • GlowMouse
  • Registratie: November 2002
  • Niet online
pietje63 schreef op maandag 16 oktober 2006 @ 13:30:
[...]
Bij de oplossing van Cheetah krijg je maximaal 10 berichten uit de laatste x dagen.
Omdat de WHERE-clausule verdwijnt, is dat niet waar. De query die hij bedoelt, luidt:
code:
1
2
3
4
SELECT title, message, DATE_FORMAT(postdate, '%d.%m.%Y %H:%i') as showdate 
FROM tabel_naam
ORDER BY postdate DESC
LIMIT 0,10

  • Paul
  • Registratie: September 2000
  • Nu online
Door de limit krijg je toch _maximaal_ 10 resultaten? De topicstarter wil juist _minimaal_ 10 resultaten. Als er in de laatste X dagen minder dan 10 berichten zijn dan moeten er ook oudere berichten bij tot je aan de 10 berichten komt (wat dus het resultaat van jouw query is), maar als er in de laatste X dagen wel meer dan 9 berichten dan moeten alleen de berichten tot X dagen geleden opgenomen worden.

Ik kom terug van mijn Count-optie-, als je die resultset toch al opvraagt kun je inderdaad beter meteen het resultaat ervan opslaan en kijken hoeveel je er gekregen hebt, zijn het er minder dan 10 (waardoor je 2e query moet gebruiken) dan is dat aan dataverkeer toch verwaarloosbaar :) Ik neem tenminste aan dat het relatief weinig voor gaat komen dat je onder de 10 berichten komt.

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Zenda schreef op zondag 15 oktober 2006 @ 22:06:
Nu wil ik dus wel dat hij altijd 10 berichten laat zien, ongeacht of het bericht nu kleiner is dan NOW() - $arch_na_x_dagen of niet.
Minimaal 10 of ook maximaal 10? Als er 20 berichten zijn binnen arch_na_x_dagen wil je er 20 tonen? Dat is nu niet duidelijk.

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

Pagina: 1