Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Select algo complicado

Estas en el tema de Select algo complicado en el foro de Mysql en Foros del Web. Buenas, les escribo porque ya me duele la cabeza de intentar escribir un algoritmo para la creación de una consulta y estoy atrancado con esto. ...
  #1 (permalink)  
Antiguo 20/08/2012, 04:57
 
Fecha de Ingreso: agosto-2012
Mensajes: 3
Antigüedad: 11 años, 8 meses
Puntos: 0
Pregunta Select algo complicado

Buenas, les escribo porque ya me duele la cabeza de intentar escribir un algoritmo para la creación de una consulta y estoy atrancado con esto. Voy a simplificar mi problema para eliminar lo que no es relevante para la consulta y así dejar solo el problema básico:

Digamos que tengo 1 tabla con 3 campos: id, campoabuscar, camponumerico

campoabuscar contienes los ids de otra tabla digamos para simplificar que son nombres de niños por ejemplo.

camponumerico son los ids de otra tabla que contiene digamos objetos.
Pongamos que el objeto 1 son canicas, y el 9 son cromos.


Por lo que esta tabla hace referencia a que niño tiene tal objeto...


Digamos que tengo estos valores:
id campoabuscar camponumerico

1 13 63
2 13 9
3 13 1
4 13 3
5 13 27
6 13 49
7 12 63
8 12 9
9 12 1
10 12 25
11 12 11
12 12 64
13 11 1
14 11 3
15 11 25
16 11 49
17 11 64
18 3 9
19 3 5
20 3 32

Como podemos ver:
3 niños (13,12,11) tienen canicas.
3 niños (13,12,3) tienen cromos.

Como se construirá el WHERE si quiero saber que niño tiene canicas y cromos (las 2 cosas a la vez) .. La solución tendría que ser 13 y 12.

Creo que mi problema esta en la estructura creo. Ya que no puedo hacer un where que diga: WHERE camponumerico=1 AND componumerico=9 (Esto es incorrecto)

Gracias
  #2 (permalink)  
Antiguo 20/08/2012, 06:05
 
Fecha de Ingreso: agosto-2012
Mensajes: 3
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Select algo complicado

Bueno, después de muchas pruebas ya lo he conseguido. Gracias a aquellos que lo hayan intentando resolver. Dejo la solución por si alguien le surge un problema parecido:

SELECT campoabuscar FROM tabla
WHERE camponumerico=1
AND campoabuscar IN (SELECT campoabuscar FROM tabla WHERE camponumerico=9 GROUP BY campoabuscar)

Ademas mi problema real no se basaba solo en restriccion a 2 numeros, sino a 2,3,4,x numeros. Así que por cada dato que se desea buscar extra se le añade otra subconsulta. asi que si buscamos un 3º con el numero 25 por ejemplo sería agregar:


AND campoabuscar IN (SELECT campoabuscar FROM tabla WHERE camponumerico=25 GROUP BY campoabuscar)

y así sucesivamente.
  #3 (permalink)  
Antiguo 20/08/2012, 08:47
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
  #4 (permalink)  
Antiguo 21/08/2012, 01:37
 
Fecha de Ingreso: agosto-2012
Mensajes: 3
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Select algo complicado

Buena solución también, menos complicada jeje.

No se me ocurrió lo del Having ya que me lie un poco ya que la consulta se genera dinámicamente dentro de un bucle for en PHP. Pero si, me crearé un array que contenga 1º los números a buscar y probare tu solución ya que parece más eficiente.

Sslu2 y Gracias.

Etiquetas: select, tabla, campos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:07.