Binnen een project waar ik nu mee bezig ben moet er een rotatorscript komen dat het inkomende verkeer en het uitgaande verkeer telt. Op dit moment ben ik bezig met het nkomende verkeer en ziet de DB structuur er zo uit:

categorieen:
- categorie_ID
- categorie_naam
- categorie_URL
- toegevoegd_datum
- toegevoegd_tijd

inkomende_hits
- hit_ID
- categorie_ID
- referrer_URL
- referrer_IP
- land_ID
- date
- time

Nu moeten de statistieken worden weergeven per categorie en gesorteerd op hoeveelheid hits. Daarbij wordt er gekeken naar het aantal hits op de dag zelf. Ook moet het aantal hits van de vorige dag worden opgehaald. Het volgende had ik al, maar verder loop ik vast:

<?php
mysql_query("SELECT *, COUNT(*) AS count FROM incoming_hits GROUP BY date, niche_ID ORDER BY count DESC, niche_ID ASC");
?>

Weet iemand misschien hoe ik verder kan?
COUNT(*) AS count

Dat gaat problemen geven.
Andere naam geven? Of..
Tuurlijk. Nooit 'reserved words' gebruiken.
Maar verder.. heb je een oplossing voor mijn probleem?
Helaas, query's zijn niet mijn sterke kant. Maar even geduld hebben lijkt mij.
Eerst de boel eens leesbaar maken:

SELECT 
  *, 
  COUNT(*) AS count 
FROM 
  incoming_hits 
GROUP BY 
  date, 
  niche_ID 
ORDER BY 
  count DESC, 
  niche_ID ASC

count is natuurlijk een rare naam, dat is een functie die een resultaat oplevert, de gekozen naam mag niet en zegt niks over het resultaat. aantal lijkt mij een betere/duidelijkere naam.

Geen idee wat jij met * allemaal opvraagt, maar dit smeekt om problemen met je GROUP BY. De GROUP BY heeft namelijk geen *, daar zul je dus álle kolomnamen moeten opnemen die niet in de aggregate functie zitten. Geen mens die weet wélke kolomnamen dat zijn, ook jij niet. Gebruik dus nooit meer een *, dat zorgt voor problemen. (en is ook langzamer)

Zie verder de tutorials over JOIN's hoe je verbanden tussen de tabellen legt.

Ps. Ik neem aan dat je wel innoDB gebruikt en foreign keys hebt aangemaakt?
Je gebruikt ook 'date', dat is ook een 'reserved word'. Niet doen dus.
SanThe schreef op 26.02.2008 16:33
Je gebruikt ook 'date', dat is ook een 'reserved word'. Niet doen dus.
Nee, dat is het niet. Deze fout wordt zovaak gemaakt, dat men het maar heeft geaccepteerd. Desondanks is het beter om een betere naam te verzinnnen, een naam die zowel een datatype als een functie is, smeekt om onduidelijkheid. En dus bugs.
@pgFrank: Je hebt gelijk, hij staat inderdaad niet in de reserved words list. Wist ik niet. Maar hoe dan ook, geen goede keuze.
maar hoe kan ik dan precies twee aantallen ophalen, dus COUNT(datum) van vandaag en gisteren?

Reageren