es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

SI.. INSERTAR.. ELSE ACTUALIZAR

¿Alguien me puede ayudar?

Tengo 3 tablas en mi base de datos:
1. admin_ (id_admin, nombre, contraseña)
2. user_ (id_user, id_admin, nombre, número de teléfono)
3. rank_ (id_rank, id_admin, total_user)

admin_

id_admin nombre
1 QG
2 me

user_

id_user id_admin nombre número de teléfono
1 1 wirno +628877812532
2 1 arya +628873812535

rank

id_rank id_admin total_user
1 1 2
2 2 0

Quiero insertar en la tabla rank el total de usuarios añadidos por el administrador y actualizarlo cuando el administrador añada más usuarios, todo esto con un trigger en SQL.

Esta es la consulta que he intentado:

IF NOT EXISTS (SELECT * FROM rank WHERE rank.id_admin = id_admin)
THEN
INSERT INTO rank (id_admin, total_user)
SELECT user_.id_admin, COUNT(user_.nombre) AS total_user FROM user_ GROUP BY user_.id_admin;

ELSE
UPDATE rank, (SELECT user_.id_admin, COUNT(user_.nombre) AS total_user FROM user_ GROUP BY user_.id_admin) AS total_ad
SET rank.total_user = total_ad.total_user
WHERE rank.id_admin = total_ad.id_admin;

END IF

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La consulta anterior parece ser un intento de insertar datos en la tabla “rank” si no existen datos en función de la columna “id_admin”. Si existen datos, la consulta intenta actualizar la columna “total_user” en función del número de usuarios asociados a cada administrador en la tabla “user_”.

    Sin embargo, hay algunos problemas con esta consulta:

    • La consulta hace referencia a una columna “username” en la tabla “user_”, pero esta columna no existe. Debe reemplazarse por “name”, que es el nombre correcto de la columna.
    • La subconsulta utilizada en la instrucción UPDATE debe hacer referencia al nombre correcto de la columna “name” en lugar de “nama_lengkap”.
    • La función “COUNT” utilizada en las instrucciones INSERT y UPDATE no tiene en cuenta el “id_admin”, y por lo tanto no proporcionará recuentos precisos para cada administrador. Debe modificarse para incluir la columna “id_admin” en la cláusula GROUP BY.

    Aquí hay una versión modificada de la consulta que aborda estos problemas:

    DELIMITER //
    
    CREATE TRIGGER update_rank AFTER INSERT ON user_
    FOR EACH ROW
    BEGIN
      IF NOT EXISTS (SELECT * FROM rank WHERE rank.id_admin = NEW.id_admin) THEN
        INSERT INTO rank (id_admin, total_user)
        SELECT user_.id_admin, COUNT(user_.id_user) AS total_user FROM user_ WHERE user_.id_admin = NEW.id_admin;
      ELSE
        UPDATE rank
        SET total_user = (SELECT COUNT(*) FROM user_ WHERE id_admin = NEW.id_admin)
        WHERE id_admin = NEW.id_admin;
      END IF;
    END; //
    
    DELIMITER ;
    

    Este desencadenante actualizará automáticamente la tabla “rank” cada vez que se inserte un nuevo registro en la tabla “user_”. Verifica si existen datos existentes para el administrador en cuestión y inserta un nuevo registro o actualiza uno existente en consecuencia. La función “COUNT” se modifica para contar solo el número de usuarios asociados al administrador específico en cuestión.

Comments are closed.