I'm archiving this web forum, which normally gets purged about once a week. So I'm screen scraping it, and storing it into my database (PostgreSQL).
I also do a little analysis on the data, with some graphs for users to enjoy, like what time of day is the forum most active, and so forth.
So I have a posts table, like so:
   Column   |            Type
------------+------------------------------
 id         | integer
 body       | text
 created_at | timestamp without time zone
 topic_id   | integer
 user_name  | text
 user_id    | integer
And I now want to have a post count for each user, for my little top 10 posters table.
I came up with this:
SELECT user_id, user_name, count(*)
FROM posts
GROUP BY user_id, user_name
ORDER BY count DESC LIMIT 10
Which turns out to be very slow. 9 seconds, with just about 300 000 rows in the posts table at the moment.
It takes only half a sec开发者_如何学JAVAond, if I group on just one column, but I need both.
I'm rather new to relational databases, and SQL, so I'm not quite sure if this is right, or just how am I doing it wrong?
There's probably only one user with a particular ID, so max(user_name) should equal user_name.   Then you can group on a single column, which your post indicates works faster:
SELECT user_id, max(user_name), count(*)
FROM posts
GROUP BY user_id
also could use having count > 0 so you only return true
 
         
                                         
                                         
                                         
                                        ![Interactive visualization of a graph in python [closed]](https://www.devze.com/res/2023/04-10/09/92d32fe8c0d22fb96bd6f6e8b7d1f457.gif) 
                                         
                                         
                                         
                                         加载中,请稍侯......
 加载中,请稍侯......
      
精彩评论