Se você não deseja uma atualização de página, a resposta é "JavaScript". Agora, você tem algumas opções lá. Pessoalmente, prefiro carregar mais na frente, então mantenho um objeto JSON que descreve as possibilidades e depois troco conteúdo estático por conteúdo estático.
Isso significaria que onchange eu teria algo como:
var first = document.getElementById( "id of first select" )
var items = possibilities[
first.value // you can also do things with selectedIndex and options if needs.
];
var second = document.getElementById( "id of second select" )
for( var i in items )
{
var opt = document.createElement('option');
opt.setAttribute('value', items[ it ] );
second.appendChild( opt );
}
Sua outra opção é enviar dados "pelo cabo" e fazê-los funcionar através do AJAX. Não tendo espaço para um tutorial, acho que posso vinculá-lo com segurança a este .