Probeelm bij maken van query in MySQL
Ik heb een tabel, genaamd "list". de structuur is als volgt:
id,friendName,friendEmail,name,email,ip,date,time,messageType
Het aantal items in de tabel loopt nu tot in de 700.
In "date" staat de dag als "November 01, 2007".
Nou komt het probleem. Ik wil kunnen zien hoeveel berichtjes er de afgelopen twee weken (14 dagen) zijn verstuurd, en ze te sorteren op "date". Het lukt me alleen niet om een juiste query ervoor te vinden.
Zelf heb ik al geprobeerd te werken met BETWEEN en de GROUP BY functie, maar het lukt me niet deze te combineren. Ik zou dus als output dit willen krijgen:
date = "November 01, 2007"
aantal verzonden = 12
Is dit duidelijk of praat ik wartaal?
Quote:
En waar is dan de datum? Voor zover mij bekend, slaat geen enkele database een datum op als een string. Jouw 'datum' is in MySQL in elk geval geen datum, geen DATE. Het datatype DATE eist namelijk het formaat yyyy-mm-dd. En wanneer je ook de tijd nodig hebt, gebruik je een DATETIME.In "date" staat de dag als "November 01, 2007".
Zie de handleiding voor de details van de diverse datatypes en duik dan ook even in de diverse functies. Er is een hele serie datum- en tijdfuncties beschikbaar, ook om jouw problemen op te lossen.
Maar begin met de datatypes, dat veroorzaakt de grootste problemen.
$format = "%B %d, %Y";
$now=getdate();
$then=strftime($format,mktime($now['hours'],$now['minutes'],$now['seconds'],$now['mon'],$now['mday']-14,$now['year']));
$now=strftime($format,mktime($now['hours'],$now['minutes'],$now['seconds'],$now['mon'],$now['mday'],$now['year']));
dan probeer ik met BETWEEN tussen deze data te selecteren.
Gewijzigd op 01/01/1970 01:00:00 door Mr Bob
Bob Kruithof schreef op 17.12.2007 00:17:
Grappenmaker.nee daar ligt het probleem niet, want ik gebruik dit:
$format = "%B %d, %Y";
$now=getdate();
$then=strftime($format,mktime($now['hours'],$now['minutes'],$now['seconds'],$now['mon'],$now['mday']-14,$now['year']));
$now=strftime($format,mktime($now['hours'],$now['minutes'],$now['seconds'],$now['mon'],$now['mday'],$now['year']));
dan probeer ik met BETWEEN tussen deze data te selecteren.
$format = "%B %d, %Y";
$now=getdate();
$then=strftime($format,mktime($now['hours'],$now['minutes'],$now['seconds'],$now['mon'],$now['mday']-14,$now['year']));
$now=strftime($format,mktime($now['hours'],$now['minutes'],$now['seconds'],$now['mon'],$now['mday'],$now['year']));
dan probeer ik met BETWEEN tussen deze data te selecteren.
Ga eerst eens iets leren over SQL en datatypes en ga dan pas de wijsneus uithangen. strftime() is een bewijs van onkunde, het is geen oplossing. Zie je huidige probleem.
en het hoeft niet uit te maken of je het via date doet in sql, of zo. het geeft allebei hetzelfde resultaat. en wil ik het nu via date doen, dan moet ik een aantal systemen veranderen.
nogmaals mijn vraag:
ik wil de resultatan tussen twee datums weergegeven kregen als:
datum1 = aantal berichten
datum2 = aantal berichten
...
enz.
en wie is er hier de wijsneus? please, ik vraag om een antwoord, niet om een discussie. daar is deze website niet voor dacht ik.
Met 700 records is dat geen probleem, maar met een paar duizend/honderdduizend/miljoen records kun je dit wel vergeten. Bestel dan eerst maar een pizza, die is sneller bezorgt dan het antwoord op jouw datum.
Ga met datums werken, dus met een DATE of DATETIME en laat de database voor jou werken. Die kan dat vele malen sneller dan dat de webserver (Apache/php) dit kan. Kan een factor tig-1000 schelen.
hoe sorteer je dan per dag, vanuit een query? het is mogelijk, maar niet in combinatie met een BETWEEN functie zover ik weet.
wat een antwoord op mijn vraag zelf is nog ver te zoeken helaas:S hoe moet het dan wel? kan je een voorbeeld geven?
Dit sorteert de boel aflopend. Voor oplopend gebruik je ASC.
SELECT * FROM tabelnbaam WHERE datum BETWEEN '2007-12-10' AND '2007-12-15'
Haalt de records op tussen 10 en 15 december. SQL maakt de boel zó eenvoudig.
selecteren van data tussen datum 1 en datum 2, en die groeperen op dag.
in ingewikkelde versie van dit dus: http://www.semeleer.nl/tut_sql.html#gb
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
SELECT
COUNT(*) AS aantal,
datum
FROM
tabelnaam
WHERE
datum BETWEEN '2007-12-10' AND '2007-12-15'
GROUP BY
datum
ORDER BY
datum DESC
COUNT(*) AS aantal,
datum
FROM
tabelnaam
WHERE
datum BETWEEN '2007-12-10' AND '2007-12-15'
GROUP BY
datum
ORDER BY
datum DESC
Wederom stelt het niet zo heel veel voor.
het werkt, en het werkt prima met mijn oplossing in strftime(), die wordt uitgerekend VOORDAT de query uberhaupt wordt gemaakt.
bedankt ;)
Heb je dat ook getest met datums in andere maanden en andere jaren? Met jouw oorspronkelijke opzet gaat dat namelijk echt niet werken, onmogelijk. April komt namelijk echt eerder dan maart.... Of niet dan??? En februari ligt natuurlijk ergens tussen april en maart, althans, wanneer je het alfabetisch bekijkt.
nogmaals bedankt hey
Je werkt jezelf nu alleen maar in de nesten, de juiste datatypes kiezen, is de basis van een goed systeem. En daar heb je een foutje gemaakt, los deze dan z.s.m. op, dat scheelt je straks een hoop ellende. Je weet nu bv. al dat jij niet/nauwelijks datumvergelijkingen kunt maken, sorteren op datums vrijwel onmogelijk is, etc. etc.
even een beetje dimmen graag, dit vind ik echt pure onzin. de enige bug in mijn systeem was dat ik geen juiste query had. en ik wist ook niet hoe ik die moest formuleren. ik heb de afgelopen twee dagen hiernaar gezocht en ben uiteindelijk hier maar geregistreerd om vervolgens de vraag aan jullie te stellen. en dan krijg ik dit soort onbeschofte reacties? Waar gaat dit over?
Het zou fijn zijn als je gewoon meteen antwoord op je vraag kreeg, in plaats van dat er (in bijna elk forum topic dat ik hier lees, echt bijna elk!) gekleineerd wordt, uit de hoogte wordt gedaan, en dit soort ongein als "te eigenwijs zijn om". Ik vind dit een prima website, maar mensen zoals jij, pgFRank zouden een beetje moeten dimmen en zich moeten richten op het helpen van mensen in plaats van doen alsof je boven een ander staat.
Als ik kijk naar de laatste berichten die pgFrank bij verschillende mensen heeft gepost, zijn ze vrijwel allemaal terechtwijzend, en is hij niet echt aardig. phphulp.nl zou zich moeten schamen voor dit soort leden.
huh? eerst zeg je dat pgFrank moet dimmen en dan ga je zelf te keer...
Jij zit in de een-na-laatste groep. Als je niet openlijk wilt accepteren dat je een fout hebt gemaakt, oké dan, maar ga jezelf niet zo voor de gek houden.
Wij gaan ons trouwens niet schamen voor pgFrank, wij zijn trots op hem, omdat hij degene is met de meeste database kennis, en hij altijd een goed antwoord voor je heeft! Als je het lekker vindt ga je nu op mij zeiken, maar het kan mij persoonlijk geen **** schelen.
Bovendien: Je kan je beter meteen aanleren om een datum in het daarvoor bedoelde datatype op te slaan, omdat de huidige opzet in de (nabije) toekomst zeker voor problemen gaat zorgen.
Frank valt je werkwijze (datamodel in dit geval) aan, en niet jou persoonlijk. Hij is eigenlijk 1 van de weinigen hier die behalve alleen maar simpel antwoord geven op een vraag, verbeteringen aandraagt die problemen in de toekomst kunnen en zullen voorkomen. Probeer beter met deze feedback (want dat is het) om te gaan, en je zal versteld staan hoeveel gemakkelijker je ineens kan werken met je systeem.
Een datum/tijd als een string opslaan doe je niet, net als je ook niet een id opslaat als een string enzo.. Enkel tekst hoor je op te slaan als string, getallen als INT en datums als DATE
overigens, wat doe je als we nu bv 6 dec zijn, en je wil de laatste 14 dagen bekijken? als ik jouw stfrtime bekijk, dan zou je between 6 dec en -8 dec doen... :-/ heel erg logisch.
Quote:
Als ik kijk naar de laatste berichten die pgFrank bij verschillende mensen heeft gepost, zijn ze vrijwel allemaal terechtwijzend, en is hij niet echt aardig. phphulp.nl zou zich moeten schamen voor dit soort leden.
Ik schaam me met name voor jou als lid op dit moment. Als je namelijk echt zoveel gelezen hebt als dat je beweerd had je dit soort uitspraken niet gedaan over Frank.
Ik word ook echt niet altijd vrolijk van hem dat mag je van me aannemen maar ik respecteer zijn inbreng omdat het goed is en hij weet waar hij over praat.
De manier waarop hij het brengt vind ik niet altijd de meest tactische maar bij Frank is de kunst (vind ik) om daar doorheen te prikken en te kijken wat hij probeert duidelijk te maken.
Als je dat goed doet heb je aan frank een goede informatiebron waar de meeste mensen (en ik niet de minste) nog een hoop van kunnen leren.
Respect to Frank.
Bob, denk je nou serieus dat iemand met 8143 posts alleen maar peop praat?