Originariamente inviato da fraermejo
il risultato è:

amico_di | amici
2 | 3,4,5
3 | 2,4,5
4 | 2,3,5
5 | 2,3,4
10 | 3,6

ti ringrazio per l'aiuto che mi hai dato , ma non ho capito bene cosa restituisce questa query...

Io dovrei ottenere una cosa di questo tipo:

Io, Luigi, cerco su RICERCA UTENTI: Francesco.
Siccome ci sono tantissime persone che si chiamano così, dovrebbe elencarle tutte, in base al numero di amici in comune che ogni Francesco ha con me. Il Francesco che ha come amici 4 dei miei amici, si troverà prima di un altro Francesco che ha come amici soltanto 2 dei miei...
Come estraggo i risultati dalla query?

Ti posto un altro dump con due tabelle, una relativa agli utenti e una alle amicizie

codice:
CREATE TABLE `amici` (
  `id` int(11) NOT NULL auto_increment,
  `amico_di` int(11) default NULL,
  `id_amico` int(11) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=latin1;


insert into `amici` (`id`,`amico_di`,`id_amico`) values 
(1,4,1),(2,4,2),(3,5,4),(4,4,6),(5,7,1),(6,2,7),(7,8,4),
(8,8,7),(9,9,1),(10,9,2),(11,9,3),(12,9,6),(13,6,4),
(14,6,7),(15,6,1),(16,6,2),(17,6,3),(18,1,2),(19,1,3),(20,4,3);


CREATE TABLE `utenti` (
  `id` int(11) NOT NULL auto_increment,
  `nome` varchar(50) default NULL,
  `cognome` varchar(50) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;

insert into `utenti` (`id`,`nome`,`cognome`) values 
(1,'Francesco','Bianchi'),(2,'Francesco','Rossi'),(3,'Francesco','Verdi'),
(4,'Luigi','Bianchi'),(5,'Stefano','Verdi'),(6,'Francesco','Rossini'),
(7,'Mario','Rossi'),(8,'Antonio','Verdi'),(9,'Stefano','Bianchi');
La query che ho scritto è questa

codice:
select amico_di,u.nome,u.cognome,quanti from (
select amico_di,count(id_amico) as quanti from (
select amico_di,id_amico from amici
union 
select id_amico,amico_di from amici 
order by id_amico ) as tab
where id_amico = any (select id_amico from amici as a inner join utenti as u
		      on a.id_amico = u.id where u.nome = 'Francesco' and amico_di = 4 
		      union
		      select amico_di from amici as a inner join utenti as u 
		      on a.amico_di = u.id where u.nome = 'Francesco' and id_amico = 4) 
and amico_di <> 4
group by amico_di) as tab2
inner join utenti as u on tab2.amico_di = u.id
order by quanti desc
il 4 dell'esempio corrisponde all'utente che effettua la ricerca, nello specifico a Luigi Bianchi e conterà quanti amici comuni di nome Francesco ha con gli altri utenti.
Nelle mie tabelline ho messo 4 utenti di nome Francesco con id 1,2,3 e 6 e tutti sono amici di Luigi. L'utente con id 9 è amico di tutti e 4, quindi il conteggio sarà pari a 4, l'utente con id 7 invece è amico solo dei Francesco con id 1,2 e 6 e quindi avrà conteggio pari a 3 e così via.
Mi sembra che faccia esattamente ciò che hai chiesto.