Vabbè lasciando stare il modo per niente normale delle tabelle ho fatto un piccolo riassunto di quello che hai scritto:
Codice PHP:
CREATE TABLE provincia (
codprovincia,
provincia,
siglaprovincia,
codregione,
PRIMARY KEY (codprovincia)
);
CREATE TABLE comune (
codcomune,
codprovincia,
comune,
siglaprovincia,
cap,
PRIMARY KEY (codcomune, cap)
);
CREATE TABLE villa (
idvilla,
nomevilla,
via,
provincia,
comune,
cap,
PRIMARY KEY(idvilla),
FOREIGN KEY provincia REFERENCES provincia(idprovincia)
FOREIGN KEY cap REFERENCES comune(cap)
);
Quindi in maniera semplificata la tua query dovrà essere più o meno:
Codice PHP:
SELECT v.*, p.provincia, c.comune
FROM villa AS v
JOIN provincia AS p ON v.provincia = p.idprovincia
JOIN comune AS c ON v.cap = c.cap;
Però se posso permettermi ci sono troppi attributi ridondanti tra provincia e comune ed inoltre nella tabella "villa" mancherebbe l'indirizzo civico che se una strada ha 1500 numeri non è troppo semplice trovare la villa