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

LEFT JOIN con solo un registro

Estas en el tema de LEFT JOIN con solo un registro en el foro de Mysql en Foros del Web. Saludos tengo mi query: Cita: SELECT A.campo1,B.campo2 FROM tabla1 A LEFT JOIN tabla2 B ON A.idtabla1=B.fkidtabla1 WHERE A.fecha>'2012-02-11 00:00:00' Mi problema es que sin el ...
  #1 (permalink)  
Antiguo 13/02/2012, 13:15
Avatar de PIRRUMAN  
Fecha de Ingreso: febrero-2006
Ubicación: Monterrey, Nuevo León
Mensajes: 633
Antigüedad: 18 años, 9 meses
Puntos: 53
LEFT JOIN con solo un registro

Saludos tengo mi query:

Cita:
SELECT A.campo1,B.campo2 FROM tabla1 A
LEFT JOIN tabla2 B
ON A.idtabla1=B.fkidtabla1
WHERE A.fecha>'2012-02-11 00:00:00'
Mi problema es que sin el LEFT JOIN me arroja 20 registros, es decir:
Cita:
SELECT A.campo1FROM tabla1 A
WHERE A.fecha>'2012-02-11 00:00:00'
y con el LEFT JOIN me trae 30,puesto que en mi tabal 2 hay dos fkidtabla1

quisiera que en la consulta se tomara el B.fkidtabla1 que tenga mayor valor en B.campo2
__________________
“Prefiero ser un tonto momentaneo que un eterno ignorante”
“¡El éxito es resultado de los aciertos,los aciertos resultado de la experiencia y la experiencia resultado de los errores!”
  #2 (permalink)  
Antiguo 13/02/2012, 13:20
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: LEFT JOIN con solo un registro

Hola PIRRUMAN:

Prueba utilizando una subconsulta en lugar de poner la tabla2 directa en el JOIN

Código MySQL:
Ver original
  1. SELECT A.campo1, B.campo2 FROM tabla1 A
  2. (SELECT MAX(campo2) campo2, fkidtabla1 FROM tabla2 GROUP BY fkidtabla1) B
  3. ON A.idtabla1 = B.fkidtabla1
  4. WHERE A.fecha > '2012-02-11 00:00:00'

Saludos
Leo.
  #3 (permalink)  
Antiguo 13/02/2012, 16:57
Avatar de PIRRUMAN  
Fecha de Ingreso: febrero-2006
Ubicación: Monterrey, Nuevo León
Mensajes: 633
Antigüedad: 18 años, 9 meses
Puntos: 53
Respuesta: LEFT JOIN con solo un registro

Gracias , lo intente pero demora bastante el query alguna idea de optimizarlo?
Cita:
SELECT A.phone_number,CASE WHEN B.start_time IS NULL THEN A.call_date
ELSE B.start_time END as fecha,CASE WHEN B.start_time IS NULL THEN
A.length_in_sec ELSE B.length_in_sec END as duracionseg,C.user,A.status,B.filename,B.location
FROM asterisk.vicidial_log A

//ASI LO TENIA Y ME DUIPLICABA RESULTADOS
LEFT JOIN recordig_log B

// ASI LO INTENTE
LEFT JOIN (SELECT MAX(length_in_sec) length_in_sec, vicidial_id,start_time,filename,location FROM recording_log GROUP BY vicidial_id) B

//ASI CON UNA VISTA
LEFT JOIN Vtblrecording B


ON A.uniqueid=B.vicidial_id

LEFT JOIN vicidial_users C ON
A.user=C.user WHERE A.campaign_id='00000002'
AND ( A.status='A' OR A.status='AB' OR A.status='ADC' OR A.status='B'
OR A.status='BROMA' OR A.status='CALLBK' OR A.status='CANCEL'
OR A.status='DC' OR A.status='DEC' OR A.status='DNC'
OR A.status='DROP' OR A.status='ENC' OR A.status='ENCARQ'
OR A.status='ENCEXP' OR A.status='ENCINC' OR A.status='INCALL'
OR A.status='INCLON' OR A.status='INFGEN' OR A.status='INFPRO'
OR A.status='MALHIS' OR A.status='N' OR A.status='NA' OR A.status='NI'
OR A.status='NOCONT' OR A.status='NOEXI' OR A.status='NOINT'
OR A.status='NTDD' OR A.status='PDP' OR A.status='PDROP' OR A.status='PRUE'
OR A.status='PTP' OR A.status='REGIST' OR A.status='SALE' OR A.status='SEGUIM'
OR A.status='SINCON' OR A.status='YACTE' OR A.status='YAENCU' )
AND date(A.call_date) >='2012-02-13' AND date(A.call_date) <='2012-02-13'
con lo que me indicaste y con la vista me demora bastante el query
mi vista es:
Cita:
SELECT MAX(length_in_sec) length_in_sec, vicidial_id,start_time,filename,location FROM recording_log WHERE vicidial_id!="" GROUP BY vicidial_id;
coloque lenght_in_sec como un indice

de antemano gracias
__________________
“Prefiero ser un tonto momentaneo que un eterno ignorante”
“¡El éxito es resultado de los aciertos,los aciertos resultado de la experiencia y la experiencia resultado de los errores!”
  #4 (permalink)  
Antiguo 13/02/2012, 18:02
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: LEFT JOIN con solo un registro

...tengo la impresión de que tu consulta es más para hacer un stored procedure bien elaborado, que una única consulta que no puede ser optimizada en base a lo que estás poniendo.
Yo te diría que elijas: Un buen SP o una consulta ineficiente. ¿Qué prefieres?
__________________
¿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 13/02/2012, 18:16
Avatar de PIRRUMAN  
Fecha de Ingreso: febrero-2006
Ubicación: Monterrey, Nuevo León
Mensajes: 633
Antigüedad: 18 años, 9 meses
Puntos: 53
Respuesta: LEFT JOIN con solo un registro

Cita:
Iniciado por gnzsoloyo Ver Mensaje
...tengo la impresión de que tu consulta es más para hacer un stored procedure bien elaborado, que una única consulta que no puede ser optimizada en base a lo que estás poniendo.
Yo te diría que elijas: Un buen SP o una consulta ineficiente. ¿Qué prefieres?
Antes de comenzar a investigar sobre procedimientos, por que cuando realizo el join sobre una vista demora ? si antes tenia un join sobre un tabla y funcionaba bien
__________________
“Prefiero ser un tonto momentaneo que un eterno ignorante”
“¡El éxito es resultado de los aciertos,los aciertos resultado de la experiencia y la experiencia resultado de los errores!”
  #6 (permalink)  
Antiguo 13/02/2012, 22:39
 
Fecha de Ingreso: febrero-2012
Ubicación: lima-peru
Mensajes: 24
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: LEFT JOIN con solo un registro

alguien me ayude con esto

Código MySQL:
Ver original
  1.  
  2.  
  3. use prueba;
  4.  
  5. create table tabla1
  6. (
  7. nombre varchar(50)
  8.  
  9. insert into tabla1 values(1,'oscar');
  10. insert into tabla1 values(2,'Carlos');
  11.  
  12.  
  13.  
  14. CREATE TABLE tabla2
  15. (
  16. idtabla2 INT PRIMARY KEY,
  17. idtabla1_1 INT ,
  18. idtabla1_2 INT,
  19. nombre VARCHAR (50),
  20.  
  21.   INDEX T1_FK1 (idtabla1_1),
  22.   FOREIGN key(idtabla1_1)
  23.   REFERENCES tabla1(idtabla1),
  24.  
  25.   INDEX T1_FK2 (idtabla1_2),
  26.   FOREIGN key (idtabla1_2)
  27.   REFERENCES tabla1(idtabla1)
  28.  
  29.  
  30.  
  31. insert into tabla2 values(1,2,1,'oscarzito');
  32. insert into tabla2 values(2,1,2,'marko');
  33. insert into tabla2 values(3,2,1,'yo');
  34. insert into tabla2 values(4,1,2,'el');
  35.  
  36. select tabla2.idtabla2,tabla1.nombre,tabla1.nombre,tabla2.nombre from tabla1 inner join tabla2 on tabla2.idtabla1_2=tabla1.idtabla1 and tabla2.idtabla1_1=tabla1.idtabla1


en la ultima linea en el select me genra doble registro .. algun solucion. Gracias,
  #7 (permalink)  
Antiguo 15/02/2012, 08:24
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: LEFT JOIN con solo un registro

Ozkitar, creo que estas sembrando el foro con la misma pregunta... por favor inicia un post propio y siguelo hasta que se te resuelva....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #8 (permalink)  
Antiguo 15/02/2012, 09:30
 
Fecha de Ingreso: junio-2011
Mensajes: 139
Antigüedad: 13 años, 5 meses
Puntos: 42
Respuesta: LEFT JOIN con solo un registro

Hola PIRRUMAN,

Quizás una consulta como la siguiente te pueda ayudar.

Código SQL:
Ver original
  1. SELECT a.campo1, MAX(b.campo2)
  2. FROM tabla1 a
  3.     LEFT JOIN tabla2 b ON a.idtabla1 = b.fkidtabla1
  4. WHERE a.fecha > '2012-02-11 00:00:00'
  5. GROUP BY a.idtabla1;
El tema de velocidad ya puede depender de otros factores.

Etiquetas: join, left, query, registro, registros, select, tabla, campos
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 22:07.