I would really recommend using counters to keep track of all the plays. At the moment, it sounds like you need to recalculate lots of statistics every time the information is requested. If you're getting play information for individual users then that isn't so bad, but creating and comparing new stats for all the artists, genres, albums and songs is pretty inefficient.
You could use one table to log all the dates that songs are played, and another one to do the counting. For example:
CREATE TABLE counter_table (
counter_type varchar(16) NOT NULL,
counter_name varchar(16) NOT NULL,
counter_value int(8) NOT NULL,
PRIMARY KEY (counter_name)
);
You could have entries in this table like ('genre', 'jazz, '50'), ('artist', 'louis_armstrong', 10') and ('song', 'stardust', '1'). Then the next time "Stardust" by Louis Armstrong is played you insert the date info into your first table, and also update the counter table using:
UPDATE counter_table SET counter_value=counter_value+1
WHERE counter_name='jazz'
OR counter_name='louis_armstrong'
OR counter_name='stardust'
This query will update the relevant artist, song and genre fields. If you then want to find the most popular genres for example, it's easy.
SELECT * FROM counter_table WHERE counter_type = 'genre' ORDER BY counter_value DESC
will return you a sorted list of genres with the most popular one on top.
I'm not saying this is absolutely the best way of doing things. The update query's a bit verbose and I'm sure the table structure could be improved but, however you decide to do it, storing all the values you need in the database will really make your life easier. 🙂