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:

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.

Ik ben (nog) niet een ster in SQL. Weet iemand misschien hoe dit te maken? :)
Altijd de laatste 10 berichten dus?


SELECT 
title
, message
, DATE_FORMAT(postdate, '%d.%m.%Y %H:%i') as showdate 
FROM
tabel_naam
ORDER BY postdate DESC
LIMIT 0,10


[edit]
Wat bedoel je met archiveren precies, worden die naar een andere tabel of database verplaatst?
[/edit]
LIMIT 0,10 hoeft dus niet perse. Ik wil dat hij een minimaal aantal berichten laat zien, ongeacht de WHERE.

Om het in woorden te vertalen:

SELECT
velden
FROM
tabel
WHERE postdate >= NOW()-10
Maar toon altijd 10 berichten
Tjah, wat je zou kunnen doen is met 2 query's (ik zie zelf geen oplossing hiervoor met 1 query)

met mysql_num_rows op je 1e query even kijken of er al 10 records zijn (minimaal!) Wanneer het aantal minder is dan 10, het verschil berekenen, en dat aantal records ophalen uit de 2e query.
in de 2e query draai je de WHERE om, dus berichten die wel ouder zijn, gesorteerd op datum (DESC), en dan de limit wel aanzetten, dat je de 1e tot en met degene zodat je wel op je minimale 10 berichten uitkomt.

(hoop dat dit een beetje duidelijk is)

[edit]
foutje
[/edit]
Misschien iets met een subquery. SELECT * FROM tabel LIMIT 0,10 - aantal_velden_uit andere query
en anders kan je het altijd met php doen.
$nog_optehalen = 10 - mysql_num_rows(mysql_query($sql));
SELECT * FROM tabel LIMIT 0,$nog_optehalen
Bas Kreleger schreef op 15.10.2006 21:51
LIMIT 0,10 hoeft dus niet perse. Ik wil dat hij een minimaal aantal berichten laat zien, ongeacht de WHERE.

Om het in woorden te vertalen:

SELECT
velden
FROM
tabel
WHERE postdate >= NOW()-10
Maar toon altijd 10 berichten

Gewoon:
SELECT
velden
FROM
tabel
ORDER BY postdate DESC
LIMIT 10
Bas Kreleger schreef op 15.10.2006 21:51
LIMIT 0,10 hoeft dus niet perse. Ik wil dat hij een minimaal aantal berichten laat zien, ongeacht de WHERE.

Om het in woorden te vertalen:

SELECT
velden
FROM
tabel
WHERE postdate >= NOW()-10
Maar toon altijd 10 berichten


Dit snap ik volgens mij, ik hoop dat mijn vorige post duidelijk is. Ik denk dat jij bedoelt:

- SELECTEER alle berchten die jonger zijn dan 10 dagen
- zijn dit er minder dan 10, dan aanvullen
Daar was ik zelf ook op gekomen, maar ik wil het graag met SQL doen, als dit mogelijk is.

edit
Tnx Jan. Zal het even proberen!
Het werkt niet zoals ik gehoopt had. Ik heb het even getest. Ik heb één rij in de tabel staan die een id nummer van 16 heeft. Omdat ik wil dat hij ongeacht de WHERE een x aantal berichten laat zien, heb ik de volgende query geprobeerd:
SELECT title, message, DATE_FORMAT( postdate, '%d.%m.%Y %H:%i' ) AS showdate
FROM bk_weblog
WHERE id >16
ORDER BY postdate DESC
LIMIT 10 


De WHERE is dus FALSE, maar door LIMIT 10 zou hij toch getoond moeten worden. Deze query geeft echter geen resultaat.
Even logisch nagedacht:
Je haalt vanaf NOW()-10 tien rijen op. met de meest 'verse' bovenaan.
dus zou je de where om moeten draaien

SELECT 
title
, message
, DATE_FORMAT(postdate, '%d.%m.%Y %H:%i') as showdate 
FROM
tabel_naam
WHERE
postdate <= NOW()-$arch_na_x_dagen
ORDER BY
postdate DESC (of ASC, ik haal ze verdomme altijd door elkaar :( )
LIMIT
10


zou het dan zijn, toch?

o nee, grr... dan haal je geen andere berichten op als er geen archief berichten zijn...
en zoiets al geprobeerd?

SELECT IF(SELECT COUNT(*) FOM BLAAT WHERE BLAAT > 10 ),je sql, je andere sql)

LOL iedereen wil de ba(a)s graag helpen natuurlijk ;)

Reageren