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

Una fácil

Estas en el tema de Una fácil en el foro de Mysql en Foros del Web. Hola, a ver quien me puede ayudar Tenido dos tablas A y B con un mismo campo llamad id_usuario, necesito extraer todos los campos de ...
  #1 (permalink)  
Antiguo 10/09/2010, 14:59
 
Fecha de Ingreso: agosto-2009
Mensajes: 80
Antigüedad: 14 años, 8 meses
Puntos: 0
Una fácil

Hola, a ver quien me puede ayudar

Tenido dos tablas A y B con un mismo campo llamad id_usuario, necesito extraer todos los campos de la tabla A cuyo id_usuario no exista en la tabla B.
He probado con algunas cosas por ejemplo != pero no funciona bien y se cuelan datos repetidos

Gracias
  #2 (permalink)  
Antiguo 10/09/2010, 15:01
Avatar de Genetix  
Fecha de Ingreso: febrero-2002
Ubicación: Lima - Perú
Mensajes: 1.600
Antigüedad: 22 años, 2 meses
Puntos: 45
Respuesta: Una fácil

Hola
Prueba Con LEFT JOIN y dentro del WHERE usa IS NULL
__________________
"El conocimiento nos hace responsables."
twitter: @benjamingb
blog personal: http://codigolinea.com
ZF Manual en español http://manual.zfdes.com
  #3 (permalink)  
Antiguo 10/09/2010, 15:25
 
Fecha de Ingreso: agosto-2009
Mensajes: 80
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Una fácil

que rapido Genetix,

Evidentemente la consulta no es tan fácil como el ejemplo que puse. La condicion where ya está siendo utilizada dentro de los iner join
estoy probando con left pero no sé exactament como.
  #4 (permalink)  
Antiguo 10/09/2010, 15:31
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: Una fácil

Una cláusula WHERE no puede estar siendo usada dentro de un INNER JOIN, por lo que supongo que debes estar usando una subconsulta dentro del FROM para obtener una tabla derivada con un prefiltrado.
De todos modos, si usas o no el WHERE es irrelevante a la hora de usar LEFT JOIN para realizar la consulta que te proponen. Debería funcionar igual.

En cualquier caso, sería mucho más simple que nos posteases la consulta que estás usando para poder darte un consejo o un ejemplo más exacto de lo que tienes que hacer, porque sino estamos hablando en abstracto... y en abstracto esto no se puede resolver.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 11/09/2010, 02:40
 
Fecha de Ingreso: agosto-2009
Mensajes: 80
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Una fácil

Perdona por la demora, pero estaba desconectado.

Bien, gnzsoloyo esta es la sentencia

SELECT DISTINCT v.marca , v.modelo , u.nombre , u.email , u.id_usuario
FROM vehiculo AS v
INNER JOIN usuarios AS u ON v.id_usuario = u.id_usuario
INNER JOIN remolque AS r ON v.id_vehiculo != r.id_vehiculo
WHERE v.estado = 'Seminuevo' AND v.combustible = 'Diesel' ORDER BY v.fecha DESC

Pretendo extraer todos los vehiculos con sus propietarios que no tengan remolque. con el != no funciona del todo bien , y el left join como dice genetic, ya de por si el left o right siempre devulve o datos o null.

Que me pueden decir sobre esto
  #6 (permalink)  
Antiguo 11/09/2010, 05:00
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: Una fácil

Por lo que dices, tienes una relación al menos que es mandatoria (usuarios - vehículos), pero otra que es opcional (vehiculo - remolque).
Para responder tu pregunta necesitamos obtener precisamente aquellos casos en que un vehículo no esté relacionado con ningún remolque, y ese "ninguno" se expresa en un NULL en la segunda relación. Como el INNER JOIN requiere la existencia de una relación válida entre las tablas vinculadas, no sirve para este caso, en esa se debe usar LEFT JOIN y en aquellos en que el campo remolque.id_vehiculo sea NULL serán los que estás buscando.

Es decir:
Código MySQL:
Ver original
  1.    v.marca,
  2.    v.modelo,
  3.    u.nombre,
  4.    u.email,
  5.    u.id_usuario
  6.    vehiculo v
  7.    INNER JOIN usuarios u ON v.id_usuario = u.id_usuario
  8.    LEFT JOIN remolque r ON v.id_vehiculo = r.id_vehiculo
  9.    r.id_vehiculo IS NULL
  10.    v.estado = 'Seminuevo' AND
  11.    v.combustible = 'Diesel'
  12. ORDER BY v.fecha DESC;

Lo que debes entender, para comprender por qué un "!=" no funciona, es que NULL no es un valor. NULL se suele definir como un puntero a la nada. Es un estado. Y ese estado determina la inexistencia, la nada, por tanto no es comparable lógicamente.
En programación eso se representa por Nothing o Null, y no se puede usar un operador lógico para determinarlo porque un operador requiere que se compare con algo que existe, con una instancia de algo y ese no es el caso de NULL.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 11/09/2010, 05:51
 
Fecha de Ingreso: agosto-2009
Mensajes: 80
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Una fácil

Estupendamente gnzsoloyo, ahora funciona correctamente.

Mi error estaba en hacer una comparación de algo como tu bien dices con la nada (NULL).

En fin, cada día se aprende un poquito más.

Lo dicho gnzsoloyo, que muchas gracias por tu ayuda

P.D Sabía que era una pregunta fácil. Pero claro, lo fácil o dificil siempre está en relación con la dificultad o facilidad del sujeto para aprenderla.
  #8 (permalink)  
Antiguo 11/09/2010, 06:50
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: Una fácil

El problema del NULL es complejo y retorcido en todos los DBMS. Por eso en los manuales suele normalmente tener un capítulo específico para que se comprenda cómo se trata en cada caso yen cada DBMS.
MySQL no es excepción; tiene su propio capítulo dedicado al asunto: 3.3.4.6. Trabajar con valores NULL
Te recomiendo leerlo al menos someramente porque te puede causar verdaderos dolores de cabeza en algunos momentos, y es mejor comprender un poco el tema.
Además, es muy útil para consultas complejas...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: Ninguno
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 20:49.