Ik ben al enige tijd bezig met het maken van een query maar het lukt niet helemaal

Wat wil ik terug zien van mijn tabel:
Ik wil de laatste 100 ingevulde datumvelden verzamelen (voteDate) en optellen hoevaal er waarop is gestemd (GOOD, OK OR BAD).

Ik dacht zelf in de richting van:
SELECT
COUNT(case when `rating` = 'GOOD' then 1 else null end) AS 'GOOD',
COUNT(case when `rating` = 'OK' then 1 else null end) AS 'OK',
COUNT(case when `rating` = 'BAD' then 1 else null end) AS 'BAD',
COUNT(case when `rating` IS NOT NULL then 1 else null end) AS 'TOTAL'
FROM `feedback` WHERE `voteDate` IS NOT NULL
LIMIT 100

Dit geeft natuurlijk maar 1 rij terug waardoor die limit 100 niet zal werken.

Dus van de laatste 100 reacties (via voteDate) wil ik optellen hoeveel reacties van welk soort er terug zijn gekomen.

Kunnen jullie wat suggestisch gooien?
zoiets, even uit het hoofd:

SELECT
	COUNT(rating) AS amount, rating
FROM
	feedback
WHERE
	voteDate IS NOT NULL
GROUP BY
	rating
ORDER BY
	voteDate DESC
LIMIT
	100


[size=xsmall]Toevoeging op 25/08/2014 15:11:38:[/size]

COUNT() is een arregate functie. In combinatie met de GROUP BY rating zorg je dat de ratings gegroepeerd worden en iedere voorkomende rating een rij oplevert.

[size=xsmall]Toevoeging op 25/08/2014 15:14:49:[/size]

nee ik realiseer me zojuist dat een subquery noodzakelijk is die eerst de 100 nieuwste votes pakt.

zal straks nog even verder kijken
Frank Nietbelangrijk op 25/08/2014 15:03:33



nee ik realiseer me zojuist dat een subquery noodzakelijk is die eerst de 100 nieuwste votes pakt.

zal straks nog even verder kijken


Ik heb inderdaad ook nagedacht maar mijn kennis gaat hier heel veel verder dan hier boven. Dus kwam daar hier helemaal uit
<?php
SELECT `rating`
COUNT(*) AS `TOTAL`,
COUNT(case when `rating` = 'GOOD' then 1 else null end) AS `GOOD`,
COUNT(case when `rating` = 'OK' then 1 else null end) AS `OK`,
COUNT(case when `rating` = 'BAD' then 1 else null end) AS `BAD`
GROUP BY `rating`
?>

Probeer dit eens even, geen idee of dit werkt maar volgens mij moet het hier ergens op lijken.

Toevoeging: The COUNT(column_name) function returns the number of values (NULL values will not be counted) of the specified column

De where clause is dus niet eens nodig.

Dit doet het inderdaad. Maar ik wil dus dit terug krijgen van alleen de laatste 100 ratings (ik heb er 7000)...

SELECT
    COUNT(r.rating) AS amount, r.rating
FROM
    (SELECT
     	voteDate,rating
     FROM
     	feedback
     WHERE
     	voteDate IS NOT NULL
     ORDER BY
     	voteDate DESC
     LIMIT 100) AS r
GROUP BY
    r.rating


getest en wel
<?php
SELECT `rating`
COUNT(*) AS `TOTAL`,
COUNT(case when `rating` = 'GOOD' then 1 else null end) AS `GOOD`,
COUNT(case when `rating` = 'OK' then 1 else null end) AS `OK`,
COUNT(case when `rating` = 'BAD' then 1 else null end) AS `BAD`
FROM (SELECT `rating` FROM `tabel` LIMIT 100)
GROUP BY `rating`
?>
Frank Nietbelangrijk op 25/08/2014 16:38:31


SELECT
    COUNT(r.rating) AS amount, r.rating
FROM
    (SELECT
     	voteDate,rating
     FROM
     	feedback
     WHERE
     	voteDate IS NOT NULL
     ORDER BY
     	voteDate DESC
     LIMIT 100) AS r
GROUP BY
    r.rating


getest en wel


YES! dankje! +100 voor Mr. NietBelangrijk!
te omslachtig en langzamer lijkt me. werkt het wel?


haha oke super
Wat voor manier adviseer je om dit sneller te doen? ik ben daar wel benieuwt naar!
snelheid win je door indexen te plaatsen op de juiste kolommen, voteDate bijvoorbeeld omdat je daar op sorteert. Ben zelf geen expert dus misschien hebben andere nog tips

Reageren