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

Ayuda consulta sql

Estas en el tema de Ayuda consulta sql en el foro de Mysql en Foros del Web. Tengo estas dos tablas y quiero hacer una consulta que no me acaba de salir Quiero seleccionar las parcelas que estan libres o reservadas pero ...
  #1 (permalink)  
Antiguo 21/04/2010, 04:47
 
Fecha de Ingreso: marzo-2009
Mensajes: 221
Antigüedad: 15 años, 1 mes
Puntos: 0
Ayuda consulta sql

Tengo estas dos tablas y quiero hacer una consulta que no me acaba de salir
Quiero seleccionar las parcelas que estan libres o reservadas pero que no esten reservadas entre dos fechas. No se si me he explicado
He intetado hacerlo mediante left join

SELECT * FROM `TParcela` tp LEFT JOIN TReserva tr ON tp.id_parc = tr.id_parcela WHERE tp.libre='si' OR tp.libre='res' AND aki vendria las condiciones de las fechas

CREATE TABLE IF NOT EXISTS `TParcela` (
`id_parc` varchar(5) NOT NULL default '',
`tipo_parc` enum('tienda','caravana','autocaravana','apart grande','apart peq') NOT NULL default 'tienda',
`m2` enum('40','50','65','75') NOT NULL default '40',
`libre` enum('si','no','res') NOT NULL default 'si',
PRIMARY KEY (`id_parc`)
)

CREATE TABLE IF NOT EXISTS `TReserva` (
`id_reserva` int(6) NOT NULL auto_increment,
`id_parcela` varchar(5) NOT NULL default '0',
`dia_reserva` date NOT NULL default '0000-00-00',
`dia_salida` date NOT NULL default '0000-00-00',
`dni_cliente` varchar(10) NOT NULL default '',
PRIMARY KEY (`id_reserva`)
)
  #2 (permalink)  
Antiguo 21/04/2010, 09:29
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
De acuerdo Respuesta: Ayuda consulta sql

BUENO YO VEO QUE EN TU TABLA DE RESERVAS MANEJAS 2 FECHAS, dia_reserva,dia_salida ASUMO QUE dia_reserva es el dia en el cual se ocuapara la parcela.

Código SQL:
Ver original
  1. SELECT     tp.*
  2.      FROM        TParcela tp
  3.      LEFT JOIN  TReserva tr ON (tp.id_parc = tr.id_parcela AND
  4.                                                 tp.id_parc NOT IN
  5.                                                 (SELECT t1.id_parcela
  6.                                                  FROM    TReserva t1)
  7.                                                  WHERE t1.dia_reserva NOT  BETWEEN 'fecha_1' AND
  8.                                                                                                               'fecha_2' AND
  9.                                                               t1.dia_salida NOT  BETWEEN 'fecha_1' AND
  10.                                                                                                               'fecha_2'))
  11.     WHERE       tp.libre='si' OR tp.libre='res'

SI LOS RESULTADOS NOS SON LOS ESPERADOS TOCARIA PONER EL SUYBQUERY EN EL WHERE.

PERO CREO QUE ASI ESTA BIEN, si no entiendes algo pues me preguntas
  #3 (permalink)  
Antiguo 21/04/2010, 10:08
 
Fecha de Ingreso: marzo-2009
Mensajes: 221
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Ayuda consulta sql

Gracias por contestar
Me da el siguiente error en la consulta

#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT t1.id_parcela


Código MySQL:
Ver original
  1. SELECT tp.* FROM TParcela tp LEFT JOIN  TReserva tr ON (tp.id_parc = tr.id_parcela AND
  2.                                                 tp.id_parc NOT IN
  3.                                                 (SELECT t1.id_parcela
  4.                                                  FROM TReserva t1)
  5.                                                  WHERE t1.dia_reserva NOT BETWEEN '2010-04-15' AND '2010-05-09' AND t1.dia_salida NOT  BETWEEN '2010-04-15' AND '2010-05-09'))
  6. WHERE  tp.libre='si' OR tp.libre='res'
  #4 (permalink)  
Antiguo 21/04/2010, 10:14
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: Ayuda consulta sql

si observas bien se me quedo un parentesis despues de FROM TReserva t1
  #5 (permalink)  
Antiguo 21/04/2010, 10:22
 
Fecha de Ingreso: marzo-2009
Mensajes: 221
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Ayuda consulta sql

Es verdad sobraba el parentesis
Código MySQL:
Ver original
  1. He vuelto a probar y me da este error ahora
  2.  
  3. SELECT tp.* FROM TParcela tp LEFT JOIN  TReserva tr ON (tp.id_parc = tr.id_parcela AND
  4.                                                 tp.id_parc NOT IN
  5.                                                 (SELECT t1.id_parcela
  6.                                                  FROM TReserva t1
  7.                                                  WHERE t1.dia_reserva NOT BETWEEN '2010-04-15' AND '2010-05-09' AND t1.dia_salida NOT  BETWEEN '2010-04-15' AND '2010-05-09')) WHERE  tp.libre='si' OR tp.libre='res'

#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT t1.id_parcela

Por cierto estoy usando phpMyAdmin no creo que haya problemas con la consulta
  #6 (permalink)  
Antiguo 21/04/2010, 10:40
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: Ayuda consulta sql

bueno, en el momento no tengo para probar mis consultas en mysql, porque no ensayas poniendo el subquery en el where.
  #7 (permalink)  
Antiguo 21/04/2010, 16:09
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: Ayuda consulta sql

tambien podrias ensayar

LEFT JOIN TReserva tr ON (tp.id_parc = tr.id_parcela AND
tr.dia_reserva NOT BETWEEN '2010-04-15' AND '2010-05-09'
AND
tr.dia_salida NOT BETWEEN '2010-04-15' AND '2010-05-09')
  #8 (permalink)  
Antiguo 22/04/2010, 05:22
 
Fecha de Ingreso: marzo-2009
Mensajes: 221
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Ayuda consulta sql

webness Gracias por las soluciones esta ultima que me has dado me da el resultado pero no exactamente lo que quiero.
Mi problema ahora es que si la parcela 1 por ejemplo tiene 3 reservas

Parcela dia_reserva dia_salida
1 2010-04-16 2010-04-18
1 2010-05-05 2010-05-10 <-
1 2010-05-20 2010-05-22 <-

Y yo en la consulta pregunto que no este ni el dia de reserva ni el dia de salida entre las fechas 2010-04-15 y 2010-04-19, me salen los 2 ultimos campos pero claro esa parcela no tendria que salir porque para esas fechas esta ocupada no se si me explico.
La consulta es correcta pero yo no puedo contar con esa parcela porque no esta libre.

He pensado de hacerlo con EXCEPT, es decir de todas las parcelas quitar las que cumplan que estan entre esas dos fechas

SELECT tp.id_parc FROM TParcela tp EXCEPT (SELECT tr.id_parcela FROM TReserva tr WHERE tr.dia_reserva BETWEEN '2010-04-15' AND '2010-04-19'
AND tr.dia_salida BETWEEN '2010-04-15' AND '2010-04-19')

Pero me da error en el phpMyAdmin

#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'EXCEPT (SELECT tr.id_parcela FROM TReserva tr WHERE tr.dia_rese

Última edición por jawir; 22/04/2010 a las 05:50
  #9 (permalink)  
Antiguo 22/04/2010, 06:05
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ayuda consulta sql

EXCEPT no existe en MySQL, lo que puedes usar es otra forma:
Código MySQL:
Ver original
  1. SELECT tp.id_parc
  2. FROM TParcela tp
  3. WHERE id_parc  NOT IN
  4.     (SELECT tr.id_parcela  
  5.     FROM TReserva tr
  6.     WHERE
  7.         (tr.dia_reserva BETWEEN '2010-04-15' AND '2010-04-19')
  8.         AND
  9.         (tr.dia_salida BETWEEN '2010-04-15' AND '2010-04-19'));
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 22/04/2010, 06:20
 
Fecha de Ingreso: marzo-2009
Mensajes: 221
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Ayuda consulta sql

Estaba buscando ahora y me he dado cuenta que no existe except en mysql

He probado tu consulta y me da este error

#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT tr.id_parcela
FROM TReserva tr
WHERE
  #11 (permalink)  
Antiguo 22/04/2010, 06:30
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ayuda consulta sql

Pruébalo así y veamos:
Código MySQL:
Ver original
  1. SELECT tp.id_parc
  2. FROM TParcela tp
  3.     (SELECT *
  4.     FROM TReserva tr
  5.     WHERE
  6.         TP.id_parc = tr.id_parcela  AND
  7.         (tr.dia_reserva BETWEEN '2010-04-15' AND '2010-04-19')
  8.         AND
  9.         (tr.dia_salida BETWEEN '2010-04-15' AND '2010-04-19'));
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 22/04/2010, 06:47
 
Fecha de Ingreso: marzo-2009
Mensajes: 221
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Ayuda consulta sql

gnzsoloyo he probado lo que me has puesto y me da este error, por cierto he cambiado esta linea
tp.id_parc = tr.id_parcela (tp estaba en maysucula pero nada)

#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'EXISTS
(SELECT *
FROM TReserva tr
WHERE
  #13 (permalink)  
Antiguo 22/04/2010, 06:57
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ayuda consulta sql

¿Qué versión de MySQL estás usando?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 22/04/2010, 07:23
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: Ayuda consulta sql

Hola veo que tanto mi primera opcion de query, junto con la primera de gnzsoloyo, las cuales incuyen WHERE campo NOT IN (SELECT -.......), sacan error cosas que hago con mucha frecuencia es postgres, ahora buscando documentacion de NOT IN en mysql pensando que no existe encontre NOT EXISTS http://dev.mysql.com/doc/refman/5.0/...ubqueries.html LO CUAL ES SIMPLEMENTE PARA SABER SI EL SUBQUERY RETORNA O NO RESULTADOS, inquietado segui buscando y encontre que si hay NOT IN http://www.mysql-hispano.org/page.php?id=31&pag=12 ----> QUE ES PARA SABER SI UN VALOR SE ENCUENTRA DENTRO DE UN LISTADO.
  #15 (permalink)  
Antiguo 22/04/2010, 07:28
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: Ayuda consulta sql

MIRA ESTO QUE ENCONTRE EN UN POST ANTERIOR ----> http://www.forosdelweb.com/f86/sente...ql-not-385626/
  #16 (permalink)  
Antiguo 22/04/2010, 07:29
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: Ayuda consulta sql

ME REGALAN UN POCO DE KARMA ???
  #17 (permalink)  
Antiguo 22/04/2010, 08:34
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ayuda consulta sql

He verificado los dos ejemplos que te he dado contra tablas con estructuras creadas para cumplir con las condiciones y no existen errores de sintaxis en ellas, sobre un servidor MySQL 5.0.x

Insisto: ¿Qué versión de MySQL estás usando para probar estas sentencias?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #18 (permalink)  
Antiguo 22/04/2010, 11:03
 
Fecha de Ingreso: marzo-2009
Mensajes: 221
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Ayuda consulta sql

Os he dado karma a los 2 por las molestias.
Gracias por responder tengo mysql inferior a 5 y por esp no me funciona he estado mirando los links que habeis puesto y mirando esto
http://www.forosdelweb.com/f86/sente...ql-not-385626/

He optado por hacer lo siguiente pero hay una cosa que no se como hacerla

Código PHP:
Ver original
  1. $res = mysql_query("SELECT id_parcela FROM TReserva WHERE dia_reserva BETWEEN '$fecha_ent' AND '$fecha_sal' OR dia_salida BETWEEN '$fecha_ent' AND '$fecha_sal'");
  2.          
  3.  while ($fila = mysql_fetch_row($res))
  4.  {
  5.     $datos[] = $fila;  
  6.  }
  7.  
  8.  $query = mysql_query("SELECT * FROM TParcela WHERE id_parc NOT IN ($datos)") or die (mysql_error());
La linea 8 ya se que esta mal pero no se como ponerlo

Ahora en $datos tengo una cadena con las parcelas que cumplen la query pero como lo pongo ahora para que sea de este modo:

$query = mysql_query("SELECT * FROM TParcela WHERE id_parc NOT IN ('TI01','TI04')") or die (mysql_error());

Última edición por jawir; 22/04/2010 a las 11:14
  #19 (permalink)  
Antiguo 22/04/2010, 11:15
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: Ayuda consulta sql

SI TU VES BIEN LO QUE ENCESITAS ES UNA CADENA CON UN VALOR COMO ESTE 'TI01','TI04' Y LO QUE TIENES ES UN ARREGLO DE DOS POSICIONES DONDE EN CADA UNA DE ELLAS HAY UN VALOR PERO SIN
COMILLAS, PUEDES CAMBIAR TU CICLO POR ALGO COMO ESTO:

$datos = "";
while ($fila = mysql_fetch_row($res))
{

$datos .= "'".$fila."',";
}

DE ESE MODO TE QUEDA LA CANDEA TAL COMO LA NECESITAS, OJO AL FINAL DEL CICLO TE QUEDA UNA COMA SULETA QUE TIENES QUE QUITAR
  #20 (permalink)  
Antiguo 22/04/2010, 12:19
 
Fecha de Ingreso: marzo-2009
Mensajes: 221
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Ayuda consulta sql

Entonces una vez haga lo que me has dicho y quite la coma que me queda suelta al final tengo que hacer la consulta asi:


Código PHP:
Ver original
  1. $query = mysql_query("SELECT * FROM TParcela WHERE id_parc NOT IN ($datos)") or die (mysql_error());

Última edición por jawir; 22/04/2010 a las 12:41
  #21 (permalink)  
Antiguo 22/04/2010, 13:26
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: Ayuda consulta sql

Excelent!!!!
  #22 (permalink)  
Antiguo 23/04/2010, 05:13
 
Fecha de Ingreso: marzo-2009
Mensajes: 221
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Ayuda consulta sql

No me acaba de funcionar bien
Hago esto para quitar la coma y luego como he puesto antes:

Código PHP:
Ver original
  1. $datos = "";
  2. while ($fila = mysql_fetch_row($res))
  3. {
  4.  
  5. $datos .= "'".$fila."',";
  6. }
  7.  $datosok =  substr($datos,0,strlen($datos)-1);
  8.  $query = mysql_query("SELECT * FROM TParcela WHERE id_parc NOT IN ($datosok)") or die (mysql_error());

Pero me sale la lista de todas las parcelas, es decir no me resta las parcelas que cumplen el select que puse en el post anterior

Si lo hago en mysql, hago el select

mysql_query("SELECT id_parcela FROM TReserva WHERE dia_reserva BETWEEN '$fecha_ent' AND '$fecha_sal' OR dia_salida BETWEEN '$fecha_ent' AND '$fecha_sal'");
Me salen estas parcelas
TI04
TI05
TI05
AU01
AU01

y luego al hacer:

mysql_query("SELECT * FROM TParcela WHERE id_parc NOT IN ('TI04','TI05','AU01')") or die (mysql_error());

Pues me resta del total de las parcelas esas 3 pero en php no es asi, no se si me he explicado
  #23 (permalink)  
Antiguo 23/04/2010, 05:22
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ayuda consulta sql

Fijate si en tu versión de MySQL (¿cuál es la que usas, en definitiva?), existe la función GROUP_CONCAT():
Código MySQL:
Ver original
  1. SELECT GROUP_CONCAT(id_parcela) id_parcela
  2. FROM TReserva
  3.     dia_reserva  BETWEEN '$fecha_ent' AND '$fecha_sal' OR
  4.     dia_salida BETWEEN '$fecha_ent' AND '$fecha_sal';
Si existe, esto debería devolverte un sólo registro con un campo con el alias de id_parcela, conteniendo todos los id_parcela separados por comas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #24 (permalink)  
Antiguo 23/04/2010, 05:52
 
Fecha de Ingreso: marzo-2009
Mensajes: 221
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Ayuda consulta sql

Tengo la version 4.0.15 y he probado la consulta y me sale este error

#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '(id_parcela) id_parcela
FROM TReserva
WHERE
dia_reserva
  #25 (permalink)  
Antiguo 23/04/2010, 06:15
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ayuda consulta sql

La pregunta del millón: ¿Existe alguna posibilidad de que cambies la versión en uso de MySQL?
Tu problema es que no es sólo una versión obsoleta, sino que dentro de esa misma versión (4.0.x), la 4.0.15 es obsoleta a su vez, porque la última fue la 4.0.22...
O sea que usas un MySQL doblemente obsoleto.

Con las versión que estás trabajando tendrás, eventualmente, problemas hasta con el PHP si el host no llega a soportar la librería para tu versión de MySQL, o es actualizado para mejorar las prestaciones web...

Piensa que, oficialmente, el ciclo del vida del proyecto MySQL 4.x terminó en diciembre del año pasado, y esa versión no tendrá más soporte (ver http://dev.mysql.com/support/eol-notice.html)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #26 (permalink)  
Antiguo 23/04/2010, 09:58
 
Fecha de Ingreso: marzo-2009
Mensajes: 221
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Ayuda consulta sql

No puedo cambiar la version del mysql porque estoy usando el servidor de un amigo y es él, el que tiene instalado esto.
Pero de todas formas la consulta que hago no me da error sino que el resultado del select no es el esperado.
  #27 (permalink)  
Antiguo 28/04/2010, 09:56
 
Fecha de Ingreso: marzo-2009
Mensajes: 221
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Ayuda consulta sql

Gracias a webness he solucionado el problema
El problema era que $fila era un array en vez de una cadena al hacer

while ($fila = mysql_fetch_row($res))

Entonces lo que hecho es lo siguiente:
Código PHP:
Ver original
  1. while ($f = mysql_fetch_row($res))
  2. {
  3.     $f = implode(",",$f);
  4.     $datos .= "'".$f."',";
  5.  }
  6.  $datosok =  substr($datos,0,strlen($datos)-1); //para quital la ultima coma de la cadena
  #28 (permalink)  
Antiguo 28/04/2010, 10:02
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
De acuerdo Respuesta: Ayuda consulta sql


Etiquetas: sql
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:37.