MySQL - Que alguien me explique

 
Vista:
Imágen de perfil de Isaias
Val: 17
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Que alguien me explique

Publicado por Isaias (9 intervenciones) el 15/05/2019 00:39:55
Hola compañeros de MYSQL, soy neófito en este motor de base de datos, mi fuerte es SQL Server, me pasaron el siguiente codigo y tengo algunas dudas, espero me ayuden a despejarlas, Saludos
1
2
3
4
5
6
7
8
INSERT INTO ctelog_hist (dia, idUsuario, host, idWSS, horaIni, horaFin)
    (SELECT h.dia, h.idUsuario, h.host, h.idWSS, h.horaIni, MAX(l.hora) as horaFin
        FROM ctelog_hist h
            JOIN log l ON l.dato = h.idWSS AND l.fecha = h.Dia AND l.operacion="{SCN}"
        WHERE Dia = CURDATE()
        AND l.hora IS NOT NULL
        GROUP BY l.idUsuario, l.dato
    ) ON DUPLICATE KEY UPDATE horaFin = VALUES(horaFin);

Entiendo que hace un INSERT y que si hay llaves duplicadas hace un UPDATE del campo horafin con el valor de ¿horafin?

Además que está haciendo un GROUP BY, supongo que es por el MAX(l.hora) as horaFin, pero lo curioso es que el GROUP BY lo hace por dos campos que no son mencionados en el SELECT: l.idUsuario, l.dato.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve
Val: 796
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Que alguien me explique

Publicado por xve (1151 intervenciones) el 15/05/2019 07:58:04
Hola Isaias, intento comentarte... Se que sabes mucho de SQL, por lo que seguramente digo cosas que ya sabes, pero lo digo por si algun otro usuario le interesa el tema.

Al hacer esto en mysql:
1
INSERT INTO t1 (a,b,c) VALUES ( SELECT campo1, campo2, campo3 FROM tabla WHERE cond=1 )
hacemos un insert en la t1 con los valores devueltos por otra consulta.
Seria lo mismo que un INSERT normal:
1
INSERT INTO t1 (a,b,c) VALUES (1,2,3)

Esto te lo comento, porque lo que haga la consulta interna, tanto si hace group by, limit, etc... al final tiene que devolver la misma cantidad de valores que espera el INSERT, aunque puede devolver uno o varios registros, que todos serán añadidos a la tabla.

Luego aparece
1
ON DUPLICATE KEY UPDATE horaFin = VALUES(horaFin);
que como tu muy bien dices, si en el INSERT encuentra alguna key duplicada, lo que hace es actualizar el campo horaFin sin añadir el nuevo registro.

Espero que me haya sabido explicar...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 17
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Que alguien me explique

Publicado por Isaias (9 intervenciones) el 15/05/2019 18:34:42
Gracias, eso me queda muy claro, lo que no me explico es:

GROUP BY l.idUsuario, l.dato

Esta AGRUPANDO por dos columnas solamente y además, que no aparecen en el SELECT
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 796
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Que alguien me explique

Publicado por xve (1151 intervenciones) el 15/05/2019 19:27:01
Si, es correcto... no tienen porque estar en el SELECT, simplemente se utiliza para obtener el resultado necesitado para el INSERT

Puedes hacer sin problema una agrupación sin que esta tenga que aparecer en los valores del SELECT

No se si esta tu duda...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 17
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Que alguien me explique

Publicado por Isaias (9 intervenciones) el 15/05/2019 20:08:50
Es correcto, NUNCA en mi vida, había visto un GROUP BY de columnas que no estan incluidas en el SELECT, ¿esto es particular de MySQL?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 796
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Que alguien me explique

Publicado por xve (1151 intervenciones) el 15/05/2019 21:45:46
La verdad no conozco otros motores de base de datos, pero no tendría mucha lógica, tener que incluir un campo en el SELECT obligatoriamente porque lo necesitas utilizar en el GROUP BY, no?

Supongo que dependerá de como trabaje el motor internamente...

Para mi es un tema normal, ya que siempre he utilizar MySQL y ahora MariaDB...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 17
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Que alguien me explique

Publicado por Isaias (9 intervenciones) el 16/05/2019 16:48:46
Pues no lo he probado, pero estoy 100% seguro que si hago lo siguiente en SQL Server, recibiría un mensaje de error

SELECT col1, col2, max(col3)
FROM tabla
GROUP BY col4, col5
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 796
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Que alguien me explique

Publicado por xve (1151 intervenciones) el 16/05/2019 19:29:37
Cuando tengas la posibilidad te agradecería si lo puedes probar y nos informaras.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 17
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Que alguien me explique

Publicado por Isaias (9 intervenciones) el 17/05/2019 01:01:41
Con gusto
1
2
3
SELECT [CuentaContable], SUM([CapitalMasInteres]) AS SUMA
  FROM [SIAC].[dbo].[_CargaInicial]
  GROUP BY [ClaveArt]


captura
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar