Boas galera!

Fiz aqui um exemplo do que eu mesmo já procurei muito por ai.

Sou péssimo para explicações, então lá vão os códigos.

Embaixo no script php, eu comentei as linhas caso queria usar a biblioteca mysql, em vez da mysqli(prefira o i, caso MySQL > 4.1)

index.php

<html>
<head>
	<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
	<script type="text/javascript">
	$(document).ready(function(){//inicio o jQuery
		$("select[name='combo1']").change(function(){
		var idCombo1 = $(this).val();//pegando o value do option selecionado
		//alert(idCombo1);//apenas para debugar a variável
		
			$.getJSON(//esse método do jQuery, só envia GET
				'combos-dependentes-function.inc.php',//script server-side que deverá retornar um objeto jSON
				{idCombo1: idCombo1},//enviando a variável

				function(data){
				//alert(data);//apenas para debugar a variável
					
					var option = new Array();//resetando a variável
					
					resetaCombo('combo2');//resetando o combo
					$.each(data, function(i, obj){
						
						
						option[i] = document.createElement('option');//criando o option
						$( option[i] ).attr( {value : obj.id} );//colocando o value no option
						$( option[i] ).append( obj.nome );//colocando o 'label'

						$("select[name='combo2']").append( option[i] );//jogando um à um os options no próximo combo
				});
			});
		});
	});	
	
	/* função pronta para ser reaproveitada, caso queria adicionar mais combos dependentes */
	function resetaCombo( el )
	{
		$("select[name='"+el+"']").empty();//retira os elementos antigos
		var option = document.createElement('option');					
		$( option ).attr( {value : '0'} );
		$( option ).append( 'Escolha' );
		$("select[name='"+el+"']").append( option );
	}
	</script>
</head>
<body>
<form action="" method="post">
	<fieldset>
		<label><select name="combo1">
			<option value="0">Escolha</option>

			<option value="1">Item 1</option>
			<option value="2">Item 2</option>
			<option value="3">Item 3</option>
		</select></label>
		
		<label><select name="combo2">
			<option value="0">Escolha</option>
		</select></label>

	</fieldset>
</form>
</body>
</html>

combos-dependentes-function.inc.php

<?php
	header("Content-Type: text/html; charset=ISO-8859-1");

	function intGet( $campo ){
		return isset( $_GET[$campo] ) ? (int)$_GET[$campo] : 0;
	}	
	function retorno( $id )
	{
		$sql = "SELECT `id`, `nome` 
			FROM `combo2` 
			WHERE `idCombo1` = {$id} ";
		$sql .= "ORDER BY `nome` ";
		
		
		$mysqli = new mysqli("localhost", "root", "123", "wbruno");

		
		$q = $mysqli->query( $sql ); 
		
		
		$json = Array();
		if( $q->num_rows > 0 )
		{
			while( $dados = $q->fetch_object() )
			{
				$json[]	= Array('nome'=> utf8_encode( $dados->nome ), 'id'=> $dados->id);
			}
		}
		else
			$json[]	= Array('nome'=> utf8_encode( 'nao encontrado' ), 'id'=> '0' );
			

		
		return json_encode( $json );
	}
	
	echo retorno( intGet('idCombo1') );

Uma forma simples de debugar, é acessando diretamente:

http://www.wbruno.com.br/scripts/combos-dependentes-function.inc.php?idCombo1=1

No meu caso, fiz essa pasta ‘combo’, só para organizar as coisas por aqui.