Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-07-2016
oleong oleong is offline
Registrado
NULL
 
Registrado: jul 2016
Posts: 6
Poder: 0
oleong Va por buen camino
Consulta sql para omitir registros

hola tengo un problema al hacer una consulta en la bd tengo tres tablas
usuarios
1 juan
2 pepe
3 carlos

ejercicios
1 primo
2 fibonacci
3 par

evaluacion
id id_usuario id_ejercicio
1 1 1
2 2 2
3 2 1
4 2 3

lo que necesito hacer es que si el usuario con id 1 tiene hecho un ejercicio en este caso con id1 busque en los otros usuarios cuales tienen la coincidencia y me muestre los ejercios que no tiene hechos y los otros user si

ejemplo si usuario1 hizo el ejercicio 1 y usuario2 hizo el ejercicios 1, 2, 3. como entre los dos existe la coincidencia del ejercicio 1, al usuario 1 debera mostrar el ejercicio 2 y 3 que hizo el usuario2
Responder Con Cita
  #2  
Antiguo 13-07-2016
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Poder: 17
TOPX Va camino a la fama
hola,
  • ¿Qué problema tiene al hacer esa consulta?
  • ¿Qué variaciones ha hecho a la consulta?
  • ¿Qué motor de base de datos usa?
  • ¿Leyó la Guía de Estilo?
  • De todas formas, utilizando mssql, la siguiente consulta puede que sirva para lo que dice necesitar:
    Código SQL [-]
    SELECT 
      ellos.id_usuario, todos.id_ejercicio
    FROM evaluacion yo
    INNER JOIN evaluacion ellos
      ON yo.id_ejercicio = ellos.id_ejercicio
        AND yo.id_usuario <> ellos.id_usuario
    INNER JOIN evaluacion todos
      ON todos.id_usuario = ellos.id_usuario
        AND todos.id_ejercicio <> yo.id_ejercicio
    WHERE yo.id_usuario = :mi_id
    ORDER BY 
      ellos.id_usuario, todos.id_ejercicio
-
__________________
"constructive mind, destructive thoughts"
Responder Con Cita
  #3  
Antiguo 14-07-2016
oleong oleong is offline
Registrado
NULL
 
Registrado: jul 2016
Posts: 6
Poder: 0
oleong Va por buen camino
hola gracias por responder uso mysql gestor phpmyadmin
tengo estas tres tablas
Código SQL [-]
CREATE TABLE IF NOT EXISTS `ejercicio` (
  `id` int(11) NOT NULL,
  `nombre` varchar(50) NOT NULL,
  `planteamiento` varchar(500) NOT NULL,
  `complejidad` varchar(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Código SQL [-]
CREATE TABLE IF NOT EXISTS `evaluacion` (
  `id` int(250) NOT NULL,
  `idusuario` int(250) NOT NULL,
  `idejercicio` int(250) NOT NULL,
  `gusto` int(250) DEFAULT NULL,
  `dificultad` int(250) DEFAULT NULL,
  `tiempo` time DEFAULT NULL,
  `estado` varchar(100) DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;

Código SQL [-]
CREATE TABLE IF NOT EXISTS `usuario` (
  `id` int(11) NOT NULL,
  `nombre` varchar(500) NOT NULL,
  `apellido` varchar(100) NOT NULL,
  `edad` varchar(100) DEFAULT NULL,
  `matricula` int(11) DEFAULT NULL,
  `email` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  `sexo` varchar(100) DEFAULT NULL,
  `estatus` varchar(100) DEFAULT NULL,
  `curso` varchar(100) DEFAULT NULL,
  `admin` int(11) NOT NULL,
  `created_at` datetime NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;

basandome en evaluacion si el usuario 1 ha realizado el ejercicio 2 y el usuario 2 a realizado el ejercicio 1, 2, y 3. la consulta debe mostrar al usuario 1 los nombres de los ejercicios 2 y 3. por la coincidencia del ejercicio 1
espero me puedan ayudar e estado probando estos select
Código SQL [-]
SELECT evaluacion.idejercicio FROM (SELECT evaluacion.idejercicio FROM evaluacion) evaluacion GROUP BY evaluacion.idejercicio HAVING count(*) =1
Código SQL [-]
select ejercicio.nombre from ejercicio inner join evaluacion on evaluacion.idejercicio=ejercicio.id WHERE evaluacion.idusuario<>1
Código SQL [-]
SELECT ejercicio.id FROM (SELECT id FROM ejercicio union ALL SELECT id FROM evaluacion)ejercicio GROUP BY ejercicio.id HAVING count(*) =1
pero no llego al objetivo
Responder Con Cita
  #4  
Antiguo 14-07-2016
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Poder: 17
TOPX Va camino a la fama
-
__________________
"constructive mind, destructive thoughts"

Última edición por TOPX fecha: 14-07-2016 a las 17:04:50. Razón: Agregar prueba.
Responder Con Cita
  #5  
Antiguo 16-07-2016
oleong oleong is offline
Registrado
NULL
 
Registrado: jul 2016
Posts: 6
Poder: 0
oleong Va por buen camino
perfecto muchas gracias
Responder Con Cita
  #6  
Antiguo 28-07-2016
oleong oleong is offline
Registrado
NULL
 
Registrado: jul 2016
Posts: 6
Poder: 0
oleong Va por buen camino
Hola de nuevo, se me ha presentado un error si me podrian ayudar a corregirlo usando datos reales en la consulta para omitir ejercicios repetidos, al ejecutar el query me repite los ejercicios que ya habia hecho

Código SQL [-]
CREATE TABLE IF NOT EXISTS `ejercicio` (
  `id` int(11) NOT NULL,
  `nombre` varchar(50) NOT NULL,
  `planteamiento` varchar(500) NOT NULL,
  `complejidad` varchar(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Código SQL [-]
CREATE TABLE IF NOT EXISTS `evaluacion` (
  `id` int(250) NOT NULL,
  `idusuario` int(250) NOT NULL,
  `idejercicio` int(250) NOT NULL,
  `nombrejercicio` varchar(250) NOT NULL,
  `gusto` int(250) DEFAULT NULL,
  `dificultad` int(250) DEFAULT NULL,
  `tiempo` time DEFAULT NULL,
  `estado` varchar(100) DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=latin1;
Código SQL [-]
CREATE TABLE IF NOT EXISTS `usuario` (
  `id` int(11) NOT NULL,
  `nombre` varchar(500) NOT NULL,
  `apellido` varchar(100) NOT NULL,
  `edad` varchar(100) DEFAULT NULL,
  `matricula` int(11) DEFAULT NULL,
  `email` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  `sexo` varchar(100) DEFAULT NULL,
  `estatus` varchar(100) DEFAULT NULL,
  `curso` varchar(100) DEFAULT NULL,
  `admin` int(11) NOT NULL,
  `created_at` datetime NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;

Código SQL [-]
INSERT INTO `ejercicio` (`id`, `nombre`, `planteamiento`, `complejidad`) VALUES
(1, 'fibonacci', 'Los numeros de Fibonacci comienzan con 0 y 1, y los siguientes terminos siempre son la suma de los dos anteriores.\nEn la siguiente tabla, podemos ver los numeros de Fibonacci desde el 0-esimo hasta el duodecimo.\n\nFn  0  1  1  2  3  5  8  13  21  34  55  89  144  ...', 'media'),
(2, 'Par', 'Verificar si un numero es par o no, usando mod', 'Bajo'),
(3, 'Primo', 'Verificar si un numero es primo o no', 'media'),
(4, 'sumatoria de numero', 'tienes que sumar 3 numeros ingresados', 'facil'),
(5, 'cajero con iva 12%', 'realizar un sistema de cajero que pague con 12%', 'media'),
(6, 'ping pong ', 'realizar ping pong ', 'Baja');
Código SQL [-]
INSERT INTO `evaluacion` (`id`, `idusuario`, `idejercicio`, `nombrejercicio`, `gusto`, `dificultad`, `tiempo`, `estado`) VALUES
(10, 2, 1, 'fibonacci', 3, 2, '00:00:03', 'Evaluado'),
(11, 2, 2, 'Par', 3, 2, '00:00:02', 'Evaluado'),
(12, 1, 1, 'fibonacci', 2, 4, '00:00:02', 'Evaluado'),
(13, 1, 4, 'sumatoria de numero', 3, 2, '00:00:02', 'Evaluado'),
(14, 2, 6, 'ping pong ', 5, 3, '00:00:03', 'Evaluado'),
(15, 2, 3, 'Primo', 3, 2, '00:00:03', 'Evaluado'),
(16, 6, 2, 'Par', 3, 2, '00:00:02', 'Evaluado'),
(17, 6, 6, 'ping pong ', 3, 2, '00:00:05', 'Evaluado');
Código SQL [-]
INSERT INTO `usuario` (`id`, `nombre`, `apellido`, `edad`, `matricula`, `email`, `password`, `sexo`, `estatus`, `curso`, `admin`, `created_at`) VALUES
(1, 'Ricardo Andres', 'Carbo Velez', '23', 1, 'rcarbovelez@gmail.com', '12345', 'Masculino', 'Estudiante', 'Matutina', 0, '2016-07-04 02:05:36'),
(2, 'Oscar', 'Leon', '22', 1, 'asd@gmail.com', '123456', 'Masculino', 'Estudiante', 'Nocturna', 0, '2016-07-02 00:23:23'),
(3, 'Genesis ', 'Bayas Senisterra', '20', 1, 'geka-b95@hotmail.com', 'qwerty', 'Femenino', 'Docente', 'Nocturna', 0, '2016-07-05 17:52:44'),
(4, 'Oscar', 'Granizo', '22', 1, 'admin@gmail.com', '123456', 'Masculino', 'Administrador', 'Matutina', 1, '2016-07-04 02:05:36'),
(5, 'Dario ', 'Leon', '22', 1, 'zxc@gmail.com', '123', 'Masculino', 'Docente', 'Nocturna', 0, '2016-07-05 17:52:44'),
(6, 'juan', 'piguave', '23', 1, 'juan@gmail.com', '123456', 'Masculino', 'Estudiante', 'Matutina', 0, '2016-07-16 10:02:15');

esta es la consulta
Código SQL [-]
SELECT todos.idusuario, todos.idejercicio, todos.nombrejercicio FROM evaluacion yo INNER JOIN evaluacion ellos ON yo.idejercicio = ellos.idejercicio AND yo.idusuario <> ellos.idusuario INNER JOIN evaluacion todos ON todos.idusuario = ellos.idusuario AND todos.idejercicio <> yo.idejercicio WHERE yo.idusuario = 6 ORDER BY  todos.idusuario, todos.idejercicio
el usuario 6 ha realizado los ejercicios par y ping pong al ejecutar el query deberia de recomendar fibonacci y primo, los recomienda si pero repite los que ya ha hecho no los omite
si me pueden ayudar en eso gracias.

ejecutado en SQL Fiddle sqlfiddle.com/#!9/8fbe0/1

Última edición por oleong fecha: 28-07-2016 a las 16:36:00. Razón: falto informacion
Responder Con Cita
  #7  
Antiguo 29-07-2016
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Poder: 17
TOPX Va camino a la fama
hola,

Disculpe por hacerle caer en un error, no preví el producto cartesiano entre todos y ellos.

Para arreglarlo, haría lo siguiente:

1. Crear una vista con los usuarios de los ejercicios en común:
Código SQL [-]
CREATE VIEW algunos AS
  SELECT 
    yo.idusuario yo_idusuario, 
    ellos.idusuario ellos_idusuario, 
    ellos.idejercicio ellos_idejercicio
  FROM evaluacion yo 
  INNER JOIN evaluacion ellos 
    ON yo.idejercicio = ellos.idejercicio 
    and yo.idusuario <> ellos.idusuario

2. Usar esa vista para filtrar aparte usuarios y aparte ejercicios:
Código SQL [-]
SELECT DISTINCT 
  todos.idusuario, todos.idejercicio
FROM evaluacion todos
INNER JOIN algunos 
  ON todos.idusuario = algunos.ellos_idusuario
    AND algunos.yo_idusuario = :miusuario
WHERE NOT todos.idejercicio IN (
  SELECT DISTINCT ellos_idejercicio
  FROM algunos
  WHERE yo_idusuario = :miusuario
) 
ORDER BY
  todos.idusuario, todos.idejercicio

3. La misma consulta anterior, pero con mejor plan de ejecución:
Código SQL [-]
SELECT 
  todos.idusuario, todos.idejercicio
FROM evaluacion todos
INNER JOIN (
  SELECT DISTINCT ellos_idusuario
  FROM algunos 
  WHERE yo_idusuario = :miusuario
) algunos
  ON todos.idusuario = algunos.ellos_idusuario
WHERE NOT todos.idejercicio IN (
  SELECT DISTINCT ellos_idejercicio
  FROM algunos
  WHERE yo_idusuario = :miusuario
)
ORDER BY
  todos.idusuario, todos.idejercicio

Las dos consultas fueron probadas en ~ http://sqlfiddle.com/#!9/a4938/2

-
__________________
"constructive mind, destructive thoughts"
Responder Con Cita
  #8  
Antiguo 29-07-2016
oleong oleong is offline
Registrado
NULL
 
Registrado: jul 2016
Posts: 6
Poder: 0
oleong Va por buen camino
gracias voy a probarlo
Responder Con Cita
  #9  
Antiguo 29-07-2016
oleong oleong is offline
Registrado
NULL
 
Registrado: jul 2016
Posts: 6
Poder: 0
oleong Va por buen camino
lo he probado funciona bien pero cuando me devuelve dos ejercicios como recomendacion por ejemplo:

Fibonacci
Primo

si escojo primo para realizarlo luego solo me deberia aparecer Fibonacci, pero me aparece repetido
Fibonacci
Fibonacci

lo pongo aqui

sqlfiddle.com/#!9/a0915/2
Responder Con Cita
  #10  
Antiguo 29-07-2016
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Poder: 17
TOPX Va camino a la fama
No está "repetido", la consulta está retornando todos los ejercicios por cada usuario.
A partir de ella podría sacar "usuarios que respondieron los mismos ejercicios" ó "ejercicios que también respondieron otros usuarios", etc.; falta interpretación por su parte.
__________________
"constructive mind, destructive thoughts"
Responder Con Cita
  #11  
Antiguo 29-07-2016
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Poder: 17
TOPX Va camino a la fama
Mayor información en:

-
__________________
"constructive mind, destructive thoughts"
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Consulta para contar registros jafera Firebird e Interbase 2 24-02-2011 17:48:39
Consulta En Access Para Devolver Varios Registros En Un Solo Renglon palets SQL 3 11-02-2009 23:47:10
Omitir texto en window.print() D-MO HTML, Javascript y otros 4 22-01-2006 05:49:46
Omitir limpieza de cabezal de impresora emeceuy Impresión 5 06-08-2005 05:07:47
Consulta para ver registros duplicados MarcoMae SQL 2 30-03-2005 18:40:43


La franja horaria es GMT +2. Ahora son las 17:54:35.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi