Ik ben al een tijdje bezig met het zichtbaar krijgen van de items van de maand. Het is dus de bedoeling dat ik een lijstje krijg met de best bekeken items van de maand, mocht het de eerste van de maand zijn en nog niet genoeg items in de best bekeken hebben dan zou hij naar de vorige maand moeten kijken.
Hieronder heb ik de code staan die ik tot nu toe heb. Sorry dat het er niet meer netjes uitziet, ik heb er al zoveel mee geprobeert dat ik er zelf niet meer uitkom.
De eerste query is om te kijken of er voldoende items al bekeken zijn, mocht dit niet het geval zijn moet hij $maand - 1 doen, dus naar de vorige maand.
$sqlm = "SELECT distinct id, count(*) as cnt FROM itemcount WHERE date LIKE '%-".$maand."-%' GROUP BY id ORDER BY cnt DESC, id LIMIT 0,$limit";
$resm = mysql_query($sqlm) or die("SELECT Error: ".mysql_error());
$items = mysql_num_rows($resm);
echo $items;
echo " ";
if ($items < 10) { $maan = --$maand; } else { $maan = $maand; }
if ($maan < 10) { $maan = "0$maan"; }
$sqlc = "SELECT distinct id, item, timestamp, count(*) as cnt FROM itemcount WHERE date LIKE '%-".$maan."-%' GROUP BY id ORDER BY cnt DESC, id LIMIT 0,$limit";
$resc = mysql_query($sqlc) or die("SELECT Error: ".mysql_error());
$item = mysql_num_rows($resc);
echo $item;
echo " ";
?>
Ik hoop dat ik het een beetje begrijpend heb kunnen uitleggen.
Alvast bedankt voor jullie tijd en moeite..
Oke, maar wat is nu je probleem? Wat gaat er fout?
Er valt nog wel wat op te merken aan je code. Bijvoorbeeld het toepassen van voorloopnullen, daar zou je heel mooi de functie sprintf() voor kunnen gebruiken:
<?php
$maand = sprintf(%02d, $maand);
?>
En gebruik in je query geen LIKE als het om data gaat. Aangezien een datum in een DATE of DATETIME veld staat en je precies weet waarop je wilt vergelijken, kun je dat met de datum/tijd functies van mysql voor elkaar krijgen.
SELECT iets
FROM tabel
WHERE MONTH(datum) = 10
Die 10 is natuurlijk een voorbeeldje, daar moet je zelf nog iets voor invullen, direct dan wel met een variabele.
Ik zie dat je een timestamp gebruikt. Waarvoor als ik vragen mag?
het probleem is dat ik bij de eerst query wel bij $items 10 krijg maar bij de 2de $item dus helemaal niks, ondanks dat hij dan eigelijk alles gewoon door moet duwen.
Wat ik niet snap is dat de 2 queries eigelijk hetzelfde zijn, maar de eerste geeft wel resultaat en de 2de niet, als de 2de ook gewoon resultaat gaf dan was het probleem opgelost. :)
En het gebruik van de timestamp en datum is omdat ik voor sommige dingen wel met timestamp kan/moet werken en met andere dingen zoals dit kan ik het dus niet. :( ik kan redelijk uit de voeten met php en sql, maar zo goed ben ik er nog niet in. :) Ik hoop dat ik nog ergens een keer een goed boek tegenkom waar alles netjes instaat. :)
Hier een query die zelf kijkt of de huidige maand moet worden genomen of de vorige maand:
<?php
$sqlm = "
SELECT
id,
count(id) as cnt
FROM
itemcount
WHERE
CASE
WHEN DAYOFMONTH(CURDATE()) = 1 THEN MONTH(date) = MONTH(DATE_ADD(CURDATE() INTERVAL -1 MONTH)
ELSE MONTH(date) = MONTH(CURDATE())
END
GROUP BY id
ORDER BY
cnt DESC,
id ASC
LIMIT 0, $limit";
?>
Nu wordt gekeken of het dagnummer 1 is, dit kun je natuurlijk nog veranderen in bv. < 3 wanneer je pas vanaf dag 3 de huidige maand wilt gaan tonen. Een timestamp heb je echt nooit nodig in de database, gebruik deze dan ook vooral niet. Het kan alleen maar problemen opleveren.
(niet getest, kan nog een foutje in zitten, maar in grote lijnen klopt het wel)
Ik heb er nu een tijdje mee lopen stoeien, maar kom er niet uit :( Hij geeft als error " SELECT Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') INTERVAL -1 MONTH) ELSE MONTH(date) = MONTH(CURDATE()) END C " dit aan. Ik heb al verschillende dingen gedaan maar blijf deze error houden. :( Ik heb nog nooit met case gewerkt dus het is een beetje vreemd voor mij, ik heb al wel op de mysql.com site gekeken maar ook niks wijzer geworden.
<?php
$sqlm = "
SELECT
id,
count(id) as cnt
FROM
itemcount
WHERE
CASE
WHEN DAYOFMONTH(CURDATE()) = 1 THEN MONTH(date) = MONTH(DATE_ADD(CURDATE()) INTERVAL -1 MONTH)
ELSE MONTH(date) = MONTH(CURDATE())
END CASE
GROUP BY id
ORDER BY
cnt DESC,
id ASC
LIMIT 0, $limit";
?>
Bedankt Jan! Wel lullig zo'n kommaatje, kan gebeuren...
Rico, let voortaan heel goed op de foutmelding die MySQL geeft. Deze geeft aan dat het bij INTERVAL fout gaat. Dan weet je dat de fout daar vlak voor moet zitten, MySQL komt vanwege een fout namelijk niet meer toe aan INTERVAL en de rest van de query. In dit geval omdat MySQL een komma verwacht.
De fout had dus helemaal niets met de CASE te maken, maar met de functie DATE_ADD() die niet goed wordt gebruikt. Dit had je vrij eenvoudig in de MySQL-handleiding kunnen vinden, zie hoofdstuk 12.5.
Mmm ik vond het al vreemd dat hij in de query niet iets moest vergelijken voor bijvoorbeeld de datum. Want ik krijg nu geen error meer, maar hij haalt ook niks uit de database. :/
De datum word opgeslagen in de table date in formaat DD-MM-YYYY. Ik heb het al geprobeert met voor de case " date = " te zetten maar dat werkt niet, krijg ik nog steeds niks, ondanks er ruim 2000 entries staan.
1) de tabelnaam 'date' is een slecht idee i.v.m. reserved words.
2) het formaat DD-MM-YYYY, daar kan MySQL niets mee. Een veld type DATE hoort YYYY-MM-DD te zijn.