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 Temas de Hoy

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: 16
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: 16
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: 16
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: 16
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: 16
TOPX Va camino a la fama
Mayor información en:

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



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 22:45:47.


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