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

Combinacion de tablas.

Estas en el tema de Combinacion de tablas. en el foro de Mysql en Foros del Web. Buenas.... Y no tan santas.... Tengo un problema y he buscado solucion pero no sé por donde van los tiros. Tengo el siguiente codigo: Código: ...
  #1 (permalink)  
Antiguo 08/04/2011, 03:32
Avatar de soy_rebeca  
Fecha de Ingreso: agosto-2008
Mensajes: 42
Antigüedad: 15 años, 7 meses
Puntos: 0
Pregunta Combinacion de tablas.

Buenas.... Y no tan santas....
Tengo un problema y he buscado solucion pero no sé por donde van los tiros.

Tengo el siguiente codigo:
Código:
SELECT * FROM fichas, copciones 
where ((fichas.alojamiento='3')
         and( fichas.ealojamiento='3')
         and( fichas.plazas='8')
         and(copciones.idopcion=13)
         or (copciones.idopcion=2)
         or (copciones.idopcion=5)
         and (copciones.idficha=fichas.idficha))
GROUP BY copciones.idficha
Ahora el tema es que me repite los registros y no sé como ponerlo para que no lo haga.

Otro problema que se me presenta es que debiera elegir los registros que contengan todas las opciones, pero cuando sustituyo el OR por en AND, no me arroja resultados, por lo que desisti, pero si alguien sabe como hacerlo, se agradeceria.

Tambien tuve el problema de que al seleccionar idficha, solo sin mas, lo tomaba mal, no se por que me toma solo el primer idficha de la tabla ficha.

Creo que no es tan complicado, pero no sé como solucionarlo y ya perdi muchisimo tiempo tratando.

I need help!!! Please??
  #2 (permalink)  
Antiguo 08/04/2011, 05:02
Avatar de soy_rebeca  
Fecha de Ingreso: agosto-2008
Mensajes: 42
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Combinacion de tablas.

Bueno al final lo saqué con ayuda a una amiga... gracias J!!!

Pongo la solución por si a alguien le pasa lo mismo o parecido.

Código:
SELECT DISTINCT * FROM fichas, copciones 
where ((fichas.alojamiento='3')
         and( fichas.ealojamiento='3')
         and( fichas.plazas='8')
         and((copciones.idopcion=13)
         or (copciones.idopcion=2)
         or (copciones.idopcion=5))
         and (copciones.idficha=fichas.idficha))
GROUP BY fichas.idficha
No sabia que el OR si no lo ponemos entre parentesis, no funciona. Una cosa a aprender.
  #3 (permalink)  
Antiguo 08/04/2011, 08:30
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Combinacion de tablas.

Hola soy_rebeca:

Cita:
No sabia que el OR si no lo ponemos entre parentesis, no funciona. Una cosa a aprender.
MUCHO OJO: No es correcto que digas que si al OR no lo pones entre paréntesis no funciona, eso podría parecer el motivo de que tu consulta no funcione, pero tiene una razón que no implica sintaxis. El problema es con la JERARQUÍA DE OPERADORES. Si hubieras revisado la documentación te podrías haber dado cuenta que las sentencias AND se ejecutan ANTES que las sentencias OR (checa la liga)

http://dev.mysql.com/doc/refman/5.0/...recedence.html

Es lo mismo que en matemáticas, si pongo

Código:
5+2*3
el resultado es 11 (no 21 como tal vez podrías suponer) ya que la multiplicación se evalúa antes que la suma. Para obtener 21 deberías hacer poner

Cita:
(5+2)*3
Es decir, con los paréntesis OBLIGAS a que se ejecute primero la suma y después la multiplicación.

Otra recomendación, en este foro hemos insistido muchas veces en utilizar JOIN's en lugar de listar tus consultas en el FROM y hacer las uniones en el WHERE, ya esta última forma de unión es muy lenta. Tu consulta por lo tanto podría quedar así:

Código MySQL:
Ver original
  1. INNER JOIN copciones on copciones.idficha=fichas.idficha
  2. fichas.alojamiento='3' and
  3. fichas.ealojamiento='3' and
  4. fichas.plazas='8' and
  5. (copciones.idopcion=13 or copciones.idopcion=2 or copciones.idopcion=5)
  6. GROUP BY fichas.idficha

O utilizando una sentencia IN

Código MySQL:
Ver original
  1. INNER JOIN copciones on copciones.idficha=fichas.idficha
  2. fichas.alojamiento='3' and
  3. fichas.ealojamiento='3' and
  4. fichas.plazas='8' and
  5. copciones.idopcion in (13, 2, 5)
  6. GROUP BY fichas.idficha

Si notas con los paréntesis OBLIGO A QUE TODOS LOS OR SE EVALUEN AL MISMO TIEMPO QUE LOS AND.

Finalmente, en la medida de lo posible evita hacer consultas select *, es mejor listar todos los campos que vas a necesitar (aquí por ejemplo se duplicaría el campo idFicha, pues pondría los de ambas tablas). También afecta el rendimiento de las consultas.

Estas son algunas mejores prácticas que deberías seguir, pero finalmente no dejan de ser recomendaciones. La decisión es tuya.

Saludos
Leo.

Etiquetas: tablas
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 04:11.