Ver Mensaje Individual
  #3 (permalink)  
Antiguo 20/08/2012, 08:47
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Select algo complicado

Hola zedwarck:

Me agrada ver que lograste obtener la consulta que necesitabas por tu cuenta, pero de cualquier manera me gustaría comentarte que hay otras maneras para resolver tu problema y que resultarían en consultas más sencillas.

Este es una consulta típica hablando de Bases de Datos, y si investigas un poco en este mismo foro o si le preguntas a SAN GOOGLE te podrás encontrar distintas maneras de resolverlo. Alguna vez escuche a un forista hacer una analogía que se aplica bastante bien a este caso: "hay muchas maneras de matar una mosca, pero utilizar una pistola puede resultar excesivo".

Una de las maneras más sencillas de resolver la consulta sería aplicando la agrupación y la cláusula HAVING... observa este script:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+--------------+---------------+
  3. | id   | campoabuscar | camponumerico |
  4. +------+--------------+---------------+
  5. |    1 |           13 |            63 |
  6. |    2 |           13 |             9 |
  7. |    3 |           13 |             1 |
  8. |    4 |           13 |             3 |
  9. |    5 |           13 |            27 |
  10. |    6 |           13 |            49 |
  11. |    7 |           12 |            63 |
  12. |    8 |           12 |             9 |
  13. |    9 |           12 |             1 |
  14. |   10 |           12 |            25 |
  15. |   11 |           12 |            11 |
  16. |   12 |           12 |            64 |
  17. |   13 |           11 |             1 |
  18. |   14 |           11 |             3 |
  19. |   15 |           11 |            25 |
  20. |   16 |           11 |            49 |
  21. |   17 |           11 |            64 |
  22. |   18 |            3 |             9 |
  23. |   19 |            3 |             5 |
  24. |   20 |            3 |            32 |
  25. +------+--------------+---------------+
  26. 20 rows in set (0.00 sec)
  27.  
  28. mysql> SELECT campoabuscar, COUNT(*) FROM tabla
  29.     -> WHERE camponumerico IN (1, 9)
  30.     -> GROUP BY campoabuscar;
  31. +--------------+----------+
  32. | campoabuscar | COUNT(*) |
  33. +--------------+----------+
  34. |            3 |        1 |
  35. |           11 |        1 |
  36. |           12 |        2 |
  37. |           13 |        2 |
  38. +--------------+----------+
  39. 4 rows in set (0.00 sec)

Observa en primer lugar que en la cláusula IN estoy listando los elementos que realmente tengo que descriminar (1 y 9), esto elimina automáticamente todos los demás registros. Observa que la columna COUNT te muestra cuántos registros cumplen con la condición, en este caso los registros 3 y 11 tienen alguno de los dos criterios, pero los registros 12 y 3 cumplen con ambos.

Finalmente, utilizas la condición HAVING para filtrar estos registros:

Código MySQL:
Ver original
  1. mysql> SELECT campoabuscar FROM tabla
  2.     -> WHERE camponumerico IN (1, 9)
  3.     -> GROUP BY campoabuscar
  4.     -> HAVING COUNT(*) = 2;
  5. +--------------+
  6. | campoabuscar |
  7. +--------------+
  8. |           12 |
  9. |           13 |
  10. +--------------+
  11. 2 rows in set (0.00 sec)

Si tienes necesidad de incrementar el número de elementos a buscar, lo unico que tendrías que hacer es incluir el elemento en el IN y poner en el valor del HAVING el número de elementos que integran el IN:

Código:
.....
WHERE camponumerico IN (1, 9, 12, 34)
.....
HAVING COUNT(*) = 4;
Dale un vistazo y nos comentas.

Saludos
Leo