How we count
The rules every table on the blog follows, written down once so the posts can get on with the football.
Every post on this blog is built around a table, and every table is computed from the same database the games use: one row per player, per club, per league season, holding appearances, goals, assists, cards and, where they were recorded, minutes. Nobody types the numbers in. A script reads the database and writes the tables, and the posts are written about what the script found.
That makes the rules below important. A table is only as honest as the decisions behind it: which seasons count, which players are left out, what a blank cell means. Those decisions are the same for every post, so rather than repeat them under every table, this page sets them out with the reason for each.
Which seasons count
The Premier League counts from its first season, 1992/93, and so does the Scottish top flight. La Liga, Serie A and the Bundesliga count from 2000/01. The database does hold those three leagues back to 1992/93, and the games use them, but the 1990s seasons carry appearances and goals only, with no minutes, assists or cards. A table that counts a player’s goals from 1992 and his bookings from 2000 is measuring two different careers, and one that openly starts at a fixed date is better than either. So the three continental leagues start at the millennium, every time.
This has consequences you will notice. Paolo Maldini, Francesco Totti and Raúl appear with their post-2000 numbers only, which undersells all three. A table of one-club players in Spain is really a table of one-club players since 2000. When a post’s argument depends on the cut-off it says so, but the cut-off itself is always the same, and the line under every table states the exact span it covers.
The posts from October 2026 onwards use finished seasons only, up to and including 2025/26. A season in progress changes every weekend, and a post published in December should say the same thing it said when it was written. Where a player is still playing, the table says so rather than counting games that have not finished yet.
Minutes, and the per-90 floor
Any rate per 90 minutes is goals (or assists) divided by minutes, multiplied by 90. Two rules keep those tables from being nonsense. The first is a floor: a player needs 9,000 minutes, roughly a hundred full matches, to be ranked. Without it, a substitute who scored twice in forty minutes would top every list in the database.
The second is that only seasons with recorded minutes count, for the goals as well as the minutes. Minutes are complete in the Premier League from 1992/93 and in the three continental leagues from 2000/01, but in Scotland they only begin in 2014/15. If a season has goals but no minutes, both are left out of the rate, because dividing a whole career’s goals by half a career’s minutes inflates the figure. That is why a per-90 table can show fewer goals for a player than his career total.
Cards and assists are as recorded
Cards follow the leagues’ own rule: a player sent off for two yellows in a match is recorded with a red card and neither yellow. Our main source counts both yellows as well, so those seasons are corrected using each player’s game-by-game record, and the Premier League table uses the league’s published totals where we have checked them. Assists are different: an assist is a judgement call that data providers make differently, which is why assist totals here will not always match the figure on a club’s own website.
A blank cell is not always a zero. A season with no minutes recorded is usually missing its cards and assists as well, so a career that includes such seasons can look cleaner or less creative than it was. For most of the database this makes no difference: the 1990s Premier League seasons that had lost their cards and assists have been restored, and the gap that remains is Scotland before 2014/15, where no minutes, cards or assists were recorded at all.
One person, one record
Football data is assembled from several sources, and the joins are imperfect. The two failures that matter for a record table are opposites. One player can be stored twice, under two spellings of his name, which halves his career and puts both halves on the list. And two different players with the same name can be stored as one, which invents a career nobody played.
The first is fixed in the data: records that are clearly the same person (same birth year, matching clubs, seasons that fit together without overlapping) are merged before any table is built. The second is caught by a simple check. If one record holds more games in a season than the league had, it must be more than one person, and it is left off every per-player table until it is untangled. Fewer than two hundred records are excluded this way, out of more than eighteen thousand careers in the tables.
The script also refuses to write a table with a known defect in it, such as a club name still carrying a data provider’s country prefix or a player appearing twice in the same league. When that happens the table is fixed at source before any post can use it.
Goalkeepers, clubs and ties
A goalkeeper is a player whose listed position is goalkeeper. Positions in the database describe a whole career, so an outfielder who once went in goal does not count, and a table of outfield players excludes keepers by the same label.
At most three clubs are shown, so a player’s clubs column is not a full career history. On most tables they are the clubs he played most for in the competition the table covers, biggest first. The exception is the table of players with the most clubs, where the count is the point and the three shown are simply the first alphabetically. Ties in the rankings are broken alphabetically by name as stored, which is arbitrary but at least the same every time a table is built.
Records within the dataset
Put together, these rules mean every table is a record within this database, for the seasons stated, and not a claim about all of football history. We say “the most in the Premier League era” where that is what the data covers, and we try never to say “all-time” about a league whose earlier decades we have not counted.
Each post states the date of the data it was built from. When the database is refreshed, posts are checked against the new figures before they go out, and if something on a published table turns out to be wrong it is corrected in place. If you spot an error, the about page says how to tell us. Corrections are the most useful thing a reader can send.