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

Ayuda con JOIN, por favor

Estas en el tema de Ayuda con JOIN, por favor en el foro de Mysql en Foros del Web. Amigos mios : Tengo 3 tablas, `users`, `user_skills` y `skils` y quiero hacer un SELECT anidado asi: SELECT user_id FROM users WHERE firstname='Juan' AND ser_lastname='Perez' ...
  #1 (permalink)  
Antiguo 24/04/2009, 10:57
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Exclamación Ayuda con JOIN, por favor

Amigos mios:

Tengo 3 tablas, `users`, `user_skills` y `skils` y quiero hacer un SELECT
anidado asi:

SELECT user_id FROM users WHERE firstname='Juan' AND ser_lastname='Perez'
SELECT skill_id FROM user_skill WHERE user_id=xxx
SELECT skill_name FROM skills WHERE skill_id=yyy

Se entiende ? xxx sale de la primera consulta y entra en la segunda que devuelve un skill_id=yyy que es el que necesito en la consulta final.

Necesito UNIR las tres consultas en una sola pero necesito vuestra ayuda, podra ser ?

GRACIAS!

Cita:
-- phpMyAdmin SQL Dump
-- version 2.10.3
-- http://www.phpmyadmin.net
--
-- Servidor: localhost
-- Tiempo de generación: 24-04-2009 a las 14:04:50
-- Versión del servidor: 5.0.45
-- Versión de PHP: 5.2.3

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Base de datos: `skill_test`
--

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `skills`
--

CREATE TABLE `skills` (
`skill_id` int(11) NOT NULL auto_increment,
`skill_name` char(100) collate latin1_general_ci NOT NULL,
PRIMARY KEY (`skill_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=7 ;

--
-- Volcar la base de datos para la tabla `skills`
--

INSERT INTO `skills` (`skill_id`, `skill_name`) VALUES
(1, 'Excel'),
(2, 'Word'),
(3, 'PHP'),
(4, 'MySQL'),
(5, 'Delphi'),
(6, '.NET');

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `users`
--

CREATE TABLE `users` (
`user_id` int(11) NOT NULL auto_increment,
`user_firstname` char(50) collate latin1_general_ci NOT NULL,
`user_lastname` char(50) collate latin1_general_ci NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=5 ;

--
-- Volcar la base de datos para la tabla `users`
--

INSERT INTO `users` (`user_id`, `user_firstname`, `user_lastname`) VALUES
(1, 'Pedro', 'Buchon'),
(2, 'Juan', 'Perez'),
(3, 'Maria Marta', 'Gonzalez'),
(4, 'Jose', 'Acasuso');

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `user_skill`
--

CREATE TABLE `user_skill` (
`user_skill_id` int(11) NOT NULL auto_increment,
`user_skill_last_modified` timestamp NULL default CURRENT_TIMESTAMP,
`user_skill_date_created` datetime default NULL,
`user_id` int(11) default NULL,
`skill_id` int(11) NOT NULL,
`skill_level` tinyint(1) default NULL,
`skill_usage` char(255) collate latin1_general_ci default NULL,
`skill_last_used` char(255) collate latin1_general_ci default NULL,
`user_skill_endorsed` tinyint(1) default NULL,
PRIMARY KEY (`user_skill_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=5 ;

--
-- Volcar la base de datos para la tabla `user_skill`
--

INSERT INTO `user_skill` (`user_skill_id`, `user_skill_last_modified`, `user_skill_date_created`, `user_id`, `skill_id`, `skill_level`, `skill_usage`, `skill_last_used`, `user_skill_endorsed`) VALUES
(1, '2009-04-24 13:43:19', NULL, 1, 3, 2, NULL, NULL, 3),
(2, '2009-04-24 13:43:19', NULL, 1, 4, 4, NULL, NULL, NULL),
(3, '2009-04-24 13:44:01', NULL, 4, 6, NULL, NULL, NULL, NULL),
(4, '2009-04-24 13:44:01', NULL, 2, 6, NULL, NULL, NULL, NULL);
__________________
Salu2!

Última edición por Italico76; 24/04/2009 a las 11:06
  #2 (permalink)  
Antiguo 24/04/2009, 11:05
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Ayuda con JOIN, por favor

Podrías intentar así
Código MySQL:
Ver original
  1. SELECT s.skill_name FROM skills s
  2.      JOIN user_skill us ON s.skill_id = us.skill_id
  3.      JOIN users u ON us.user_id = u.user_id
  4. WHERE u.firstname = 'Juan' AND u.ser_lastname = 'Perez';
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 24/04/2009, 11:07
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Ayuda con JOIN, por favor

SELECT user_id FROM users INNER JOIN user_skills ON users.user_id=user_skills.user_id INNER JOIN skills ON skills.skill_id = user_skill.skill_id WHERE users.firstname='Juan' AND user.user_lastname='Perez'

No sé cómo has llamado a los campos de User_skill que son foreign key, es decir, los que están relacionados con skill_id de skills y user_id de users, pero he imaginado que igual.
He puesto una búsqueda según la cual encontrarás a aquellos que se llaman sólo Juan y además sólo tienen un apellido que es Perez. Si quieres que te encuentre todos los Juan lo que sea y Perez lo que sea o no

SELECT user_id FROM users INNER JOIN user_skills ON users.user_id=user_skills.user_id INNER JOIN skills ON skills.skill_id = user_skill.skill_id WHERE users.firstname LIKE 'Juan%' AND users.user_lastname LIKE 'Perez%'

Perdón: David te me adelantaste.
  #4 (permalink)  
Antiguo 24/04/2009, 11:09
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Ayuda con JOIN, por favor

David: gracias! pero me da un error:

Cita:
MySQL ha dicho: Documentación

#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 'u.firstname = 'Juan' AND u.ser_lastname = 'Perez'
LIMIT 0, 30' at line 1
__________________
Salu2!
  #5 (permalink)  
Antiguo 24/04/2009, 11:11
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Ayuda con JOIN, por favor

Dinos qué consulta has lanzado para que te dé ese error. Fíjate en esto:
u.ser_lastname
en lugar de u.user_lastname
  #6 (permalink)  
Antiguo 24/04/2009, 11:21
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Ayuda con JOIN, por favor

EXITO!!!! con la consulta de DAVID el GRANDE y la sagaz observacion de JURENA, el MAESTRO se ha resuleto mi problema :)

Código MySQL:
Ver original
  1. SELECT s.skill_name FROM skills s     JOIN user_skill us ON s.skill_id = us.skill_id     JOIN users u ON us.user_id = u.user_id WHERE u.user_firstname = 'Juan' AND u.user_lastname = 'Perez';
__________________
Salu2!
  #7 (permalink)  
Antiguo 24/04/2009, 11:36
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Ayuda con JOIN, por favor

Una ultima consulta: cómo se podria ver la informacion asI:

user_firstname | user_lastname | skill_name

Juan ................... Perez ................. .NET
Pedro ................... Buchon .............. PHP
Pedro .................. Buchon .............. MySQL

Es posible ?
__________________
Salu2!
  #8 (permalink)  
Antiguo 24/04/2009, 11:37
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Ayuda con JOIN, por favor

En la selección de campos (donde está s.skill_name) eliges todos los campos que quieras mostrar.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #9 (permalink)  
Antiguo 24/04/2009, 12:10
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Ayuda con JOIN, por favor

ju......bueno gracias amigo David!

de todas formas,......no parece tener mucho sentido, no ?
__________________
Salu2!
  #10 (permalink)  
Antiguo 24/04/2009, 12:13
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Ayuda con JOIN, por favor

SELECT u.user_firstname,u.user_lastname,s.skill_name
FROM skills s
JOIN user_skill us ON s.skill_id = us.skill_id
JOIN users u ON us.user_id = u.user_id
WHERE u.user_firstname = 'Juan'
AND u.user_lastname = 'Perez'

Ya soy feliz
__________________
Salu2!
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 11:52.