Procedura mysql che non inserisce dati

di il
2 risposte

Procedura mysql che non inserisce dati

Salve a  tutti ho fatto una procedura per inserimento di dati in una tabella che non fa nulla.

la procedura è questa :

DELIMITER //

CREATE PROCEDURE raccomandazione_contenuti(IN CodiceAlfanumerico VARCHAR(255))

BEGIN

    -- Memorizza le preferenze dell'utente nelle variabili

    DECLARE generePreferito INT;

    DECLARE registaPreferito INT;

    DECLARE attorePreferito INT;

   

    SELECT GenereID INTO generePreferito FROM preferenzeutentegeneri WHERE UtenteID = CodiceAlfanumerico LIMIT 1;

    SELECT RegistaID INTO registaPreferito FROM preferenzeutenteregisti WHERE UtenteID = CodiceAlfanumerico LIMIT 1;

    SELECT AttoreID INTO attorePreferito FROM preferenzeutenteattori WHERE UtenteID = CodiceAlfanumerico LIMIT 1;

    -- Raccomanda film dell'ultimo anno che non sono stati visti dall'utente

    INSERT INTO FilmRaccomandati (ID, UtenteID, Genere, Regista, AttorePrincipale, AnnoProduzione, RatingMedia)

    SELECT 

        DISTINCT f.ID,

        CodiceAlfanumerico,

        (SELECT g.Nome FROM film_genere fg JOIN Genere g ON fg.ID_Genere = g.ID WHERE fg.ID_Film = f.ID LIMIT 1) AS Genere,

        (SELECT r.Nome FROM film_regista fr JOIN Regista r ON fr.ID_Regista = r.ID WHERE fr.ID_Film = f.ID LIMIT 1) AS Regista,

        (SELECT a.Nome FROM film_attore fa JOIN Attore a ON fa.ID_Attore = a.ID WHERE fa.ID_Film = f.ID LIMIT 1) AS AttorePrincipale,

        f.Anno_Produzione,

        (f.ratingUtente + f.ratingCritico) / 2 AS RatingMedia

    FROM 

        Film f

    WHERE 

        f.Anno_Produzione >= YEAR(CURRENT_DATE) - 1 AND

        f.ID NOT IN (SELECT FilmID FROM HistoryVisualizzazioni WHERE UtenteID = CodiceAlfanumerico) AND

        (generePreferito IS NULL OR f.ID IN (SELECT ID_Film FROM film_genere WHERE ID_Genere = generePreferito)) AND

        (registaPreferito IS NULL OR f.ID IN (SELECT ID_Film FROM film_regista WHERE ID_Regista = registaPreferito)) AND

        (attorePreferito IS NULL OR f.ID IN (SELECT ID_Film FROM film_attore WHERE ID_Attore = attorePreferito))

    ORDER BY 

        CASE 

            WHEN generePreferito IS NOT NULL AND f.ID IN (SELECT ID_Film FROM film_genere WHERE ID_Genere = generePreferito) THEN 1

            ELSE 0

        END +

        CASE 

            WHEN registaPreferito IS NOT NULL AND f.ID IN (SELECT ID_Film FROM film_regista WHERE ID_Regista = registaPreferito) THEN 1

            ELSE 0

        END +

        CASE 

            WHEN attorePreferito IS NOT NULL AND f.ID IN (SELECT ID_Film FROM film_attore WHERE ID_Attore = attorePreferito) THEN 1

            ELSE 0

        END DESC,

        (f.ratingUtente + f.ratingCritico) / 2 DESC

    LIMIT 10;

END //

DELIMITER ;

 e le tabelle e colonne interessate sono queste :

CREATE TABLE Utenti ( CodiceAlfanumerico VARCHAR(255) PRIMARY KEY, Nome VARCHAR(255), Cognome VARCHAR(255), 

CREATE TABLE HistoryVisualizzazioni ( ID INT PRIMARY KEY, UtenteID VARCHAR(255), FilmID INT, DataVisualizzazione DATE, FOREIGN KEY (UtenteID) REFERENCES Utenti(CodiceAlfanumerico), FOREIGN KEY (FilmID) REFERENCES Film(ID) );

 CREATE TABLE FilmRaccomandati ( ID INT PRIMARY KEY, UtenteID VARCHAR(255), Genere VARCHAR(255), Regista VARCHAR(255), AttorePrincipale VARCHAR(255), AnnoProduzione INT, RatingMedia DECIMAL(3, 1), FOREIGN KEY (UtenteID) REFERENCES Utenti(CodiceAlfanumerico), FOREIGN KEY (ID) REFERENCES Film(ID) ); 

le colonne della tabella film : ID, Titolo, Descrizione, Durata, Anno_Produzione, Nazione_Produzione, Id_regista, ratingUtente, ratingCritico

 le colonne della tabella genere: ID, Nome 

le colonne della tabella film_genere :ID_Film, ID_Genere

 le colonne della tabelle preferenzeutentegeneri : ID, UtenteID, GenereID

 le colonne della tabella preferenzeutenteattori : ID, UtenteID, AttoreID

 le colonne della tabella preferenzeutenteregisti : ID, UtenteID, RegistaID 

le colonne della tabella regista :ID, Nome, Cognome

 le colonne della tabella film_regista :ID_Film, ID_Regista

 le colonne della tabella film_attore : ID_Film, ID_Attore 

le colonne della tabella attore :ID, Nome, Cognome

C'è qualcuno che può darmi una mano ? 

Grazie 

2 Risposte

  • Re: Procedura mysql che non inserisce dati

    01/08/2023 - kapotesta ha scritto:


    Salve a  tutti ho fatto una procedura per inserimento di dati in una tabella che non fa nulla.

    Da come hai scritto la premessa sembra che tu voglia creare di proposito una supercazzola…

    Come dire “ho trovato il modo di cercare lavoro senza trovarlo”.

    1) prima di dover ricostruire mentalmente le tabelle, cosa vorresti ottenere?

    2) hai una maschera che chiede il film preferito a chi?

        Mi spiego meglio, se io volessi dare il voto al film preferito, che dovrei fare?

    3) perchè non hai inserito il 3d nella sessione mysql?

    4) HistoryVisualizzazioni perchè non la implementi ogni volta che l'utente pinkopallo si collega a film e cerca un determinato film?

    5) perchè alle domande non fai la singola insert? hai l'utente, risponde che gli piace il triller, che gli piace quell'attore, quel regista ecc… per quale motivo scrivere una procedura piu' lunga del decamerone con l'ausilio di select e subselect, variabili e istruzioni case?

    rispondi a questo e magari ricevi suggerimenti.

  • Re: Procedura mysql che non inserisce dati

    E' un progetto per un esame." Per migliorare l’esperienza dell’utente, FILM è dotato di un sistema di raccomandazione
    basato sui contenuti visualizzati dagli utenti e sulle loro preferenze. Ad esempio, un utente che ha visualizzato molti film di fantascienza, nei cast dei quali comparivano determinati attori, può ricevere consigli per altri film dello stesso tipo (o simile). Il database deve mantenere tutte le informazioni necessarie affinché ciò sia possibile.
    Gli studenti devono inoltre implementare una funzionalità di raccomandazione
    di contenuti (e memorizzarne i dati necessari) che, dato un utente, sfrutti uno o più criteri opportunamente definiti per suggerire film potenzialmente graditi al cliente,
    in base alla sua "history" di visualizzazioni."

    Dunque per migliorare l'esperienza dell'utente abbiamo creato un sistema di raccomandazioni basati sui contenuti visualizzati dagli utenti e sui loro preferenze quindi abbiamo pensato di creare una procedura di raccomandazioni di film che si trovano nella tabella film e che possano piacere per il genere , il regista e l'attore preferito dall'utente. Consideriamo che vogliamo raccomandare 10 film diversi che non siano stati ancora visualizzati dall'utente e quindi non esistono nella sua History visualizzazioni e consideriamo innanzitutto i film dell'ultimo anno. Se esiste un film dell'ultimo anno non ancora visto dall'utente e che possa soddisfare le condizioni di genere di regista e di attore allora lo inseriamo subito nella tabella raccomandazioni. Se invece esiste un film dell'ultimo anno non ancora visto dall'utente ma che soddisfa solo due delle tre condizioni, ossia solo genere è regista oppure solo genere è attore oppure solo regista e attore allora andiamo a considerare anche le Due Colonne del film di Rating utente e Rating critico e si sceglie il film con la media più alta da inserire nella tabella raccomandazione. Se non riusciamo a trovare i 10 film da raccomandare cercandoli nell'ultimo anno, usiamo la stessa tecnica di ricerca per gli anni 

    precedenti finché non raggiungiamo il numero di 10 film cercati e non ancora visti dall'utente.

    Questo il motivo della supercazzola.

     Comunque grazie di avermi risposto  . 

    questa è la nuova procedura che soddisfa in parte quello che volevo fare perchè scrive nell tabella filmraccomandati:

    DELIMITER //

    CREATE PROCEDURE raccomandazione_contenuti(IN CodiceAlfanumerico VARCHAR(255))

    BEGIN

        -- Raccomanda film dell'ultimo anno che non sono stati visti dall'utente

        INSERT INTO FilmRaccomandati (ID, UtenteID, Genere, Regista, AttorePrincipale, AnnoProduzione, RatingMedia)

        SELECT 

            f.ID,

            CodiceAlfanumerico,

            (SELECT g.Nome FROM film_genere fg JOIN Genere g ON fg.ID_Genere = g.ID WHERE fg.ID_Film = f.ID LIMIT 1) AS Genere,

            (SELECT r.Nome FROM film_regista fr JOIN Regista r ON fr.ID_Regista = r.ID WHERE fr.ID_Film = f.ID LIMIT 1) AS Regista,

            (SELECT a.Nome FROM film_attore fa JOIN Attore a ON fa.ID_Attore = a.ID WHERE fa.ID_Film = f.ID LIMIT 1) AS AttorePrincipale,

            f.Anno_Produzione,

            (f.ratingUtente + f.ratingCritico) / 2 AS RatingMedia

        FROM 

            Film f

        WHERE 

            f.Anno_Produzione >= YEAR(CURRENT_DATE) - 1 AND

            f.ID NOT IN (SELECT FilmID FROM HistoryVisualizzazioni WHERE UtenteID = CodiceAlfanumerico)

        ORDER BY 

            (CASE 

                WHEN (SELECT COUNT(*) FROM film_genere fg WHERE fg.ID_Film = f.ID AND fg.ID_Genere IN (SELECT GenereID FROM preferenzeutentegeneri WHERE UtenteID = CodiceAlfanumerico)) > 0 THEN 1

                ELSE 0

            END +

            CASE 

                WHEN (SELECT COUNT(*) FROM film_regista fr WHERE fr.ID_Film = f.ID AND fr.ID_Regista IN (SELECT RegistaID FROM preferenzeutenteregisti WHERE UtenteID = CodiceAlfanumerico)) > 0 THEN 1

                ELSE 0

            END +

            CASE 

                WHEN (SELECT COUNT(*) FROM film_attore fa WHERE fa.ID_Film = f.ID AND fa.ID_Attore IN (SELECT AttoreID FROM preferenzeutenteattori WHERE UtenteID = CodiceAlfanumerico)) > 0 THEN 1

                ELSE 0

            END) DESC, 

            (f.ratingUtente + f.ratingCritico) / 2 DESC

        LIMIT 10

        ON DUPLICATE KEY UPDATE RatingMedia = (f.ratingUtente + f.ratingCritico) / 2;

    END //

    DELIMITER ;

    se hai suggerimenti  ti ringrazio del tuo tempo.

    Ciao

Devi accedere o registrarti per scrivere nel forum
2 risposte