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

Consulta un poco rara

Estas en el tema de Consulta un poco rara en el foro de Mysql en Foros del Web. Hola, Estoy intentando sacar de una tabla lo siguiente: La tabla tiene lo siguiente: Nombres ID | Nombre 1 | Juan 2 | Luis Opciones ...
  #1 (permalink)  
Antiguo 01/09/2009, 11:16
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Consulta un poco rara

Hola,

Estoy intentando sacar de una tabla lo siguiente:

La tabla tiene lo siguiente:

Nombres
ID | Nombre
1 | Juan
2 | Luis

Opciones
ID | IdNombre | Opcion
1 | 1 | 14
2 | 2 | 16
3 | 1 | 15

Quiero sacar los nombres que tengan como opción 14 y 15, se podría hacer con INTERSECTION, pero MySQL no lo soporta.

¿Como lo puedo hacer?

Muchas Gracias
  #2 (permalink)  
Antiguo 01/09/2009, 11:27
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta un poco rara

SELECT nombres.nombre FROM nombres INNER JOIN opciones ON nombres.id = opciones.idnombre WHERE opciones.opcion IN (14,15) GROUP BY nombres.id HAVING count(distinct opcion) = 2

No lo he probado
  #3 (permalink)  
Antiguo 01/09/2009, 11:33
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: Consulta un poco rara

Gracias por tu respuesta Jurena,

He probado y me saca los que tienen opcion 14 o opcion 15, lo que necesito es que saque el que tiene la opcion 14 y la opcion 15, es decir que en la tabla opciones tengan las dos.
¿Como lo puedo hacer?

Gracias
  #4 (permalink)  
Antiguo 01/09/2009, 12:37
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta un poco rara

Perdona, yazo,
pero la consulta
SELECT nombres.nombre FROM nombres INNER JOIN opciones ON nombres.id = opciones.idnombre WHERE opciones.opcion IN (14,15) GROUP BY nombres.id HAVING count(distinct opcion) = 2

funciona si es que buscas el nombre de alguien que tenga esas dos opciones. Ahora la he probado. Vuelve a probarla.
  #5 (permalink)  
Antiguo 01/09/2009, 12:41
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: Consulta un poco rara

¿Que quiere decir lo siguiente? HAVING count(distinct opcion) = 2

Muchas Gracias Jurena
  #6 (permalink)  
Antiguo 01/09/2009, 12:48
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: Consulta un poco rara

He probado y solo me sale un registro, pero tengo más nombres que cumplen la condición ¿porque puede ser?

Las tablas que aqui he puesto son un ejemplo, en realidad son más extensas y tienen mas registros.

Gracias de nuevo.
  #7 (permalink)  
Antiguo 01/09/2009, 12:56
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta un poco rara

Pon los datos o pásanos la estructura de tu tabla con algunos datos para que la pongamos a prueba. Estoy seguro de que esa consulta funciona, pero nunca se sabe.
Lo que hago es buscar primero aquellos registros que o bien tienen 14 ó 15 pero agrupados por nombres.id; luego, de esa consulta busco sólo aquellos nombres.id que tienen 2 datos distintos en ese campo opción. Si el mismo nombre tiene el 14 y el 15, cuenta 2, y sólo lo hará ese.
Ofrécenos la estructura con algunos datos...
  #8 (permalink)  
Antiguo 01/09/2009, 17:41
 
Fecha de Ingreso: marzo-2009
Mensajes: 73
Antigüedad: 15 años, 1 mes
Puntos: 1
Respuesta: Consulta un poco rara

no eh probado esto pero alomejor te sirve. aunque creo que es ineficiente

select * from nombres where id in (select idnombre from opciones where opcion=15) and id in (select idnombre from opciones where opcion=14)

algo asi, creo funcionara
  #9 (permalink)  
Antiguo 01/09/2009, 18:01
 
Fecha de Ingreso: julio-2006
Ubicación: sevilla
Mensajes: 251
Antigüedad: 17 años, 9 meses
Puntos: 5
Respuesta: Consulta un poco rara

es mas facil lo siguiente


select n.nombre from Nombres n, Opciones o where o.idnombre=n.idnombre and opcion >= 15 and opcion <=14

puedes hacer union natural siempre que las dos tablas o mas tenga un campo en comun como es el caso de estas dos a traves de idnombre
  #10 (permalink)  
Antiguo 01/09/2009, 23:28
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta un poco rara

navergame,
ningún registro cumplirá esa condición, pues ninguno puede tener a la vez 15 y (con AND) 14, como le estás pidiendo en esa consulta. Piensa que, en la estructura de tabla que tenemos, 15 y 14 están en dos registros distintos de la tabla opciones.

Última edición por jurena; 02/09/2009 a las 02:20
  #11 (permalink)  
Antiguo 02/09/2009, 01:42
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: Consulta un poco rara

Muchas Gracias a todos por vuestras respuestas,

Las consultas de jurena y 7xtr3am funcionaban perfectamente, la de jurena la había puesto una cosilla mal y por eso solo me sacaba un registro.

Gracias nevergame por tu respuesta.
  #12 (permalink)  
Antiguo 02/09/2009, 02:12
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Consulta un poco rara

¿ pero como te funcionó la de nevergame si esta pidiendo un numero que sea mayor o igual a 15 y a la misma vez que esa opción sea menor o igual a 14? Aunque no entiendo porque hacer ese tipo de consulta ya que esta pidiendo el infinito de los numeros. Es como pedir toda la base de datos en realidad , pero como te indique aun así no entiendo como te funcionó la de nevergame.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #13 (permalink)  
Antiguo 02/09/2009, 02:24
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 21 años
Puntos: 3
Respuesta: Consulta un poco rara

La consulta de nevergame no me ha funcionado pero le he dado las gracias de todas formas por su respuesta.

Un Saludo
  #14 (permalink)  
Antiguo 02/09/2009, 02:30
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta un poco rara

yazo, la consulta propuesta por 7xtr3am
select * from nombres where id in (select idnombre from opciones where opcion=15) and id in (select idnombre from opciones where opcion=14)
tiene un pequeño inconveniente (en realidad no sé si para tu caso lo es): que si el registro tiene algún otro valor en opciones además de 14 y 15 que no sea 14 ó 15, también será mostrado. Imaginemos que 1 tiene 14, 15 y 16. Esa consulta te lo mostrará. Por otra parte, supone dos subconsultas, lo que no sé si será más eficiente que el uso de where con OR y el group by con su having que te propuse (eso tendrán que decirlo los técnicos, aunque yo para estos casos prefiero usar el group by porque recorrería una vez la tabla, quizás 2 por el IN con dos elementos).
Pero si te sirve en esas condiciones, mi propuesta para el caso sería esta:
Código sql:
Ver original
  1. SELECT nombres.nombre
  2.  FROM nombres INNER JOIN opciones
  3.  ON nombres.id = opciones.idnombre WHERE opciones.opcion IN (14,15)
  4.  GROUP BY nombres.id HAVING COUNT(DISTINCT opcion) > 1

Saludos a todos.

Última edición por jurena; 02/09/2009 a las 02:38
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 17:26.