Secondo me stai sbagliando logica di visualizzazione.
mi metto nei panni di un utente collezionista.
1) metto in vendita/scambio i doppioni
2) cerco l'elenco dei doppioni disponibili all'acquisto/scambio degli utenti associati.
per il punto 1 metto in tabella "doppie" le mie doppie (la tabella potrebbe non esistere ma estrapolata dalla tabella collezioni where quantità > 1 and utente=utenteloggato (io))
il punto 2 sarebbe la stesa sql con utente<>utenteloggato (io))
quando cerco una cartolina la query mi mostra le q.tà disponibili da parte degli altri utenti.
es.
idCartolina descrizione miniaturaimmagine disponibilità tipodisponibilità(vendita/scambio)
lato molti (o selezionando una cartolina) vedrei chi la detiene e se vende o scambia (se la mette su doppioni è per vendere o scambiare).
in questo caso avrei come record il numero di record <= al numero di record del catalogo e la quantità che è la somma dei doppioni degli utenti (al netto degli idcartolina in mio possesso)
nel dettaglio potrei anche inviare un messaggio all'utente/utenti se sono interessato all'acquisto/scambio.
a che serve una tabella in risposta N*N?
al massimo una right join where null per ottenere i risultati della tabella lato destro al netto dei campi in comune (dove i campi in comune sono le cartoline in mio possesso).
morale della favola: rivedi la logica che stai usando.