What you could have is a single table with the following information, which works on a parent/child relationship with itself:
[INDENT]LocationID = auto_increment, primary key
LocationType = either [Country/Region/City/Town]
LocationName = Name of Location (e.g. England, Manchester, London, etc.)
LocationLink = Where this particular location is a "child" of[/INDENT]
As data is entered into the table, you will essentially be "drilling" through the Country, then Region, then City, then Town. All top-level (countries essentially) entries will have a LocationLink of zero. See the example below:
INDENT, (LocationType), (LocationName), (LocationLink)
1, Country, England, 0
2, Country, Scotland, 0
3, Country, Wales, 0
4, Region, North West England, 1
5, City, Manchester, 4
6, Town, Greater Manchester, 5[/INDENT]
So when a person selects a location (e.g. LocationId=6), you will be able to navigate upwards following the child/parent links - LocationId 6 links to 5, in turn links to 4, in turn links to 1.
Conversely, if a person selects a City you will immediately be able to see which Towns the person has access to. For example, person selects Manchester you would have "SELECT LocationName FROM tblLocation WHERE LocationLink=4".