tuve que releer 50 veces el post para entender lo que queres, y sin embargo me quedan dudas
novlucker te entendio igual que yo al leer tu primer post, donde dijiste que campo1 y campo2 deben ser iguales, pero cuando explicas los resultados, no son iguales campo1 y campo2
si decis:
-Campo1=0 y campo2=2
-Campo1=2 y campo2=5
ahi campo 1 vale 0 y el otro vale 2 , no son iguales...lo que vos queres creo entender es listar simplemente los repetidos, que se repitan entre 0 y 3 veces, pero que los valores no sean iguales...sino el unico que cumpliria con esa condicion seria el primer registro, donde ambos son 1...me explico?
mira el select que te paso novlucker, esta bien salvo que tenes que cambiar los alias del having ya que no se pueden usar alias ahi. y sacale el "WHERE campo1 = campo2" , tambien agrega el campo2 al Group By, sino te tira error, ya que estas usando COUNT(*) arriba y debes agrupar por todo.
quedaria asi:
SELECT campo1, Campo2, COUNT(*) AS total
FROM tabla1
GROUP BY campo1, campo2
HAVING COUNT(*) > 0 AND COUNT(*) < 3
ORDER BY COUNT(*) DESC
ahi te devuelve:
Campo 1 Campo2 Total Repetidas
0 2 2
5 2 1
1 1 1
en todo caso fijate que el ultmo registro tambien entra en la condicion, ya que se repite 1 vez y eso es mayor a 0 y menor a 3...
la ultima linea del select que le agrege simplemente ordena del mayor repetido al menor...
EDITO: revisando tampoco entraria en la lista ese que vos decis que se repite 3 veces ya que vos queres que sea menor a 3 y no igual a 3...si queres que entre la cantidad 3 simplemente cambia y pone
"AND COUNT(*) <= 3"saludos.