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

Negar consulta

Estas en el tema de Negar consulta en el foro de Mysql en Foros del Web. Buen dia para todos. Apenas estoy empezando en este cuento de procedimientos almacenados. Tengo el siguiente procedimiento: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original DELIMITER $$ ...
  #1 (permalink)  
Antiguo 10/01/2013, 23:00
Avatar de Jorge1801  
Fecha de Ingreso: julio-2011
Ubicación: Colombia
Mensajes: 54
Antigüedad: 13 años, 4 meses
Puntos: 2
Negar consulta

Buen dia para todos.

Apenas estoy empezando en este cuento de procedimientos almacenados. Tengo el siguiente procedimiento:

Código MySQL:
Ver original
  1. DELIMITER $$
  2. DROP PROCEDURE IF EXISTS sp_reservarcitas$$
  3. CREATE PROCEDURE sp_reservarcitas()
  4.     DECLARE name text;
  5.     select @name:=GROUP_CONCAT(id_horario)
  6.     from tbl_citas
  7.     where fecha_cita = '2013-01-10';
  8.  
  9.     select id_horario, tipo_horario
  10.     from tbl_horarios
  11.     where FIND_IN_SET(id_horario,@name);
  12.    
  13. END$$
Mi duda es como yo puedo negar en la parte donde dice FIND_IN_SET para que no me busque los valores que están almacenados en @name. Es decir que me busque todos los registros excepto los valores que tengo almacenado en @name.

Espero haberme hecho entender.

Muchas gracias.

Última edición por gnzsoloyo; 11/01/2013 a las 03:42 Razón: SQL sin etiquetar.
  #2 (permalink)  
Antiguo 11/01/2013, 03:43
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Negar consulta

Primero, est´s complicando innecesariamente ese SP. No necesitas dos sentencias y la variable para lo que haces, sino sólo una:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. DROP PROCEDURE IF EXISTS sp_reservarcitas$$
  3. CREATE PROCEDURE sp_reservarcitas()
  4.     select id_horario, tipo_horario
  5.     from tbl_horarios
  6.     where id_horario IN(select id_horario from tbl_citas where fecha_cita = '2013-01-10');
  7. END$$

Que también se puede escribir:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. DROP PROCEDURE IF EXISTS sp_reservarcitas$$
  3. CREATE PROCEDURE sp_reservarcitas()
  4.     SELECT  H.id_horario, H.tipo_horario
  5.     FROM tbl_horarios H LEFT JOIN tbl_citas C ON H.id_horario = C.id_horario;
  6. END$$

Y para negarlo sería:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. DROP PROCEDURE IF EXISTS sp_reservarcitas$$
  3. CREATE PROCEDURE sp_reservarcitas()
  4.     select id_horario, tipo_horario
  5.     from tbl_horarios
  6.     where id_horario NOT IN(select id_horario from tbl_citas where fecha_cita = '2013-01-10');
  7. END$$
o bien:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. DROP PROCEDURE IF EXISTS sp_reservarcitas$$
  3. CREATE PROCEDURE sp_reservarcitas()
  4.     SELECT  H.id_horario, H.tipo_horario
  5.     FROM tbl_horarios H LEFT JOIN tbl_citas C ON H.id_horario = C.id_horario
  6.     WHERE C.id_horario IS NULL;
  7. END$$

Nota final: en tu SP, "name" y "@name" son dos variables diferentes.
Las variables locales se declaran y se usan sin "@".
Las variables con "@" son variables de tipo sesión, que no se declaran sino que se incializan, y su valor inicial es NULL.
En tu caso está funcionando porque el primer SELECT la está inicializando con un valor dado, pero eso significa que la "name" es inútil.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 12/01/2013, 04:46
Avatar de Jorge1801  
Fecha de Ingreso: julio-2011
Ubicación: Colombia
Mensajes: 54
Antigüedad: 13 años, 4 meses
Puntos: 2
Respuesta: Negar consulta

Muchísimas gracias, de verdad me sirvió bastantes. Aprendí muchas cosas que no sabia.

Etiquetas: negar, registros, select
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 06:20.