Hola nosoul:
Hay un problema con el código de Gustavo72, para este caso la cláusula DISTINCT no sirve pues hay que recordar que cuando se lista más de un campo
SE EXCLUYEN SÓLO AQUELLOS REGISTROS DONDE TODOS LOS CAMPOS SEAN IGUALES, no sólo uno. Es por eso que vuelven a aparecer los mismos registros. Veamos si este ejemplo les deja más claro el problema:
Código MySQL:
Ver original+------+----------+
| id | nombre |
+------+----------+
| 1 | uno |
| 1 | uno |
| 1 | otro uno |
| 2 | uno |
+------+----------+
+------+
| id |
+------+
| 1 |
| 2 |
+------+
+----------+
| nombre |
+----------+
| uno |
| otro uno |
+----------+
+------+----------+
| id | nombre |
+------+----------+
| 1 | uno |
| 1 | otro uno |
| 2 | uno |
+------+----------+
+------+----------+
| id | nombre |
+------+----------+
| 1 | uno |
| 1 | otro uno |
| 2 | uno |
+------+----------+
Observen en el último caso poner entre paréntesis el campo id es exactamente lo mismo que no ponerlo, pues como dije anteriormente la comparación se hace sobre la totalidad de los campos. Es por eso que cuando se incluyen los dos campos sólo se excluye el id=1 con nombre=uno pues este SI ESTÁ DUPLICADO.
Ahora bien, con respecto al problema original, no me queda del todo claro qué es lo que quieres hacer, pero según el planteamiento veamos si esto te sirve.
Supongamos que tenemos estos datos de ejemplo:
Código MySQL:
Ver original+------+---------+--------+---------+
| id | nombre | codigo | tamanio |
+------+---------+--------+---------+
| 1 | Pelota3 | 100 | 420 |
| 2 | Carpa1 | 200 | 445 |
| 3 | Pelota2 | 100 | 440 |
| 4 | Carpa2 | 200 | 340 |
| 5 | Carpa3 | 100 | 350 |
| 6 | Pelota4 | 100 | 380 |
+------+---------+--------+---------+
Si quisiéramos obtener aquellos productos PARA CADA CATEGORÍA con la menor diferencia con respecto a un tamaño de 400 tendríamos que hacer el siguiente procedimiento (espero no extenderme mucho en el planteamiento, pero quiero dejarles lo más claro posible la lógica de la consulta, pues este tipo de consultas estoy seguro que les servirá en el futuro). Si obtenemos las diferencias con respecto a un tamaño base de 400 obtenemos lo siguiente:
Código MySQL:
Ver originalmysql
> SELECT id
, nombre
, codigo
, tamanio
, tamanio
-400 diferencia
FROM tabla
;+------+---------+--------+---------+------------+
| id | nombre | codigo | tamanio | diferencia |
+------+---------+--------+---------+------------+
| 1 | Pelota3 | 100 | 420 | 20 |
| 2 | Carpa1 | 200 | 445 | 45 |
| 3 | Pelota2 | 100 | 440 | 40 |
| 4 | Carpa2 | 200 | 340 | -60 |
| 5 | Carpa3 | 100 | 350 | -50 |
| 6 | Pelota4 | 100 | 380 | -20 |
+------+---------+--------+---------+------------+
Observen el primer detalle que quiero hacer notar,
LAS DIFERENCIAS PUEDEN SER TANTO POSITIVAS COMO NEGATIVAS, es decir tamaños más grandes o más pequeños con respecto a la base. si no interesa en realidad el signo pueden hacer uso de la función ABS para manejar absolutos. Ahora bien, como quieren obtener las mínimas diferencias POR CATEGORÍA pueden hacer algo como esto:
Código MySQL:
Ver original+--------+------------+
| codigo | diferencia |
+--------+------------+
| 100 | 20 |
| 200 | 45 |
+--------+------------+
Ahora bien, esa información ES LA QUE DEBEN TOMAR EN CUENTA PARA FILTRAR LA INFORMACIÓN. Una manera de hacerlo (que no la única y posiblemente no la mejor) sería haciendo esto:
Código MySQL:
Ver original -> ON T1.codigo
= T2.codigo
AND ABS(T1.tamanio
- 400) = T2.diferencia
+------+---------+--------+---------+
| id | nombre | codigo | tamanio |
+------+---------+--------+---------+
| 1 | Pelota3 | 100 | 420 |
| 6 | Pelota4 | 100 | 380 |
| 2 | Carpa1 | 200 | 445 |
+------+---------+--------+---------+
Observen que para el código 100 aparecen dos registros PUES AMBOS TIENEN UNA DIFERENCIA DE 20 UNA HACIA ARRIBA Y OTRA HACIA ABAJO. Para el caso de del codigo 200 sólo muestra uno, pues los otros registros tienen una diferencia de 50 y 60 respectivamente.
Espero que con este ejercicio puedas obtener tu consulta, cualquier duda la comentas en el foro
Saludos
Leo.