webForumDet fria alternativet

En SQL-fråga för att få ut hur många böcker jag köpt under året

Databaser & SQL

6 svar · 547 visningar · startad av jme

Medlem sedan maj 20012 237 inlägg
Frågan#1

Hej.

Jag håller på att skapa en liten graf över hur många böcker jag har köpt under året, månadsvis. Grafen skall visa data för 6 månader åt gången (2 bakåt och 3 framåt).

Tabellen i fråga heter book och har bl a följande kolumner:

- id
- title
- author
- created_at (datumet jag har lagt in boken i registret och kan ses som köpsdatum)

Just nu har jag kommit fram till följande SQL-fråga:

	SELECT
		(SELECT count(*) FROM book WHERE created_at BETWEEN '2010-05-01 00:00:00' AND '2010-05-31 23:59:59'),
		(SELECT count(*) FROM book WHERE created_at BETWEEN '2010-06-01 00:00:00' AND '2010-06-30 23:59:59'),
		(SELECT count(*) FROM book WHERE created_at BETWEEN '2010-07-01 00:00:00' AND  '2010-07-31 23:59:59')
	FROM
		book 
	WHERE
		created_at > '0000-00-00'
	LIMIT
		1

Ovan stående fråga hämtar alltså data för tre månader.

WHERE-satsen måste jag ha då jag har lagt till created_at i senare stund och då får vissa rader i tabellen värdet '000-00-00 ...' som jag inte vill få med i resultatet.

Denna fråga verkar fungera men jag skulle gärna vilja förbättra den då just nu behövs LIMIT 1. Jag är inte helt säker på att min fråga är optimal.

Medlem sedan juni 200032 967 inlägg
#2

Ser inte helt optimalt, och inte helt dynamiskt ut. :)

Jag hade gjort något sånt härnt:

    SELECT count(*), MONTH(created_at), YEAR(created_at)
    FROM
        book 
    WHERE
        created_at > '0000-00-00'
    GROUP BY MONTH(created_at), YEAR(created_at)

EDIT: Vill du få resultatet lite sexigare kan du använda MONTHNAME() istället för MONTH().

mvh

Medlem sedan maj 20012 237 inlägg
#3

Ser MYCKET bättre ut, tack. Kan man bygga ut frågan och få den att hämta data för endast vald range? T ex

a)

bara för Juni, Juli och Augusti i år

b)

December (2010, Januari (2011) och Februari)?

Medlem sedan nov. 20017 144 inlägg
#4

A

SELECT count(*), MONTH(created_at), YEAR(created_at)
    FROM
        book 
    WHERE
        created_at BETWEEN '2010-06-01' AND '2010-08-31'
    GROUP BY MONTH(created_at), YEAR(created_at)

B

SELECT count(*), MONTH(created_at), YEAR(created_at)
    FROM
        book 
    WHERE
        created_at BETWEEN '2010-12-01' AND '2011-02-28'
    GROUP BY MONTH(created_at), YEAR(created_at)

...kanske.

Medlem sedan maj 20012 237 inlägg
#5

Jamensåklart! :r

Medlem sedan juli 200012 978 inlägg
#6

Hur kan du veta vilka böcker du köpt om tre (3) månader! om Inköpsdatum är regdatum? ;-)

Medlem sedan maj 20012 237 inlägg
#7

Bra fråga. :D

261 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
131 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)