Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [mySQL] - Ottimizzazione query

    Ciao a tutti!!!
    Vorrei chiedervi aiuto per la risoluzione di alcune query. Le ho già scritte di mio, ma in realtà, anche se funzionano, sembrano parecchio lunghe e confusionarie e magari c'è un modo più semplice per scriverle che a me sfugge.
    Dato che sono 10 query, vi scrivo solo quelle su cui ho più dubbi

    Il nostro database è così formato
    Transazione(CodiceT , Offerta, Data, Centro di raccolta)
    Offerta( CodiceO , Venditore)
    Gruppo di acquisto([I] Acquirente, Transazione[/U] )
    Composizione( Offerta, Bene )
    Afferenza( Bene, Categoria )
    Feedback( Acquirente, Transazione , Voto numerico, Giudizio testuale)
    Acquirente(CodiceA, Città fatturazione)

    Le query ci chiedono di trovare
    1."Tutti gli acquirenti che hanno effettuato transazioni di beni appartenenti alla stessa categoria e che hanno espresso valutazioni negative sul venditore (voto < 3)"
    2. Tutti i venditori che hanno ricevuto valutazioni negative dagli stessi acquirenti.
    3. Tutti i venditori che hanno ricevuto valutazioni positive dagli acquirenti che vivono nella stessa città.

    Query1
    codice:
    CREATE VIEW `Categoria beni transazioni` AS
    SELECT 
        T1.`Codice transazione` AS Transazione,
        A1.Bene,
        A1.Categoria
    FROM
        Transazione T1
            JOIN
        Offerta O1 ON T1.Offerta = O1.`Codice offerta`
            JOIN
        Composizione C1 ON O1.`Codice offerta` = C1.Offerta
            JOIN
        Afferenza A1 ON C1.Bene = A1.Bene;
    
    CREATE `Info voti` AS
    SELECT 
        Acquirente, 
        Venditore, 
        Transazione, 
        `Voto numerico` AS Voto, 
        `Giudizio testuale` AS Giudizio
    FROM 
        Feedback AS F1 
            JOIN 
        Transazione AS T1 ON F1.Transazione = T1.`Codice transazione`
            JOIN 
        Acquirente AS A1 ON F1.Acquirente = A1.`Codice acquirente`;
    
    CREATE VIEW `Acquirente-Categoria` AS
    SELECT DISTINCT
        IV1.Acquirente,
        IV1.Venditore,
        IV1.Voto,
        IV1.Transazione,
        CB1.Categoria
    FROM
        `Info voti` IV1
            JOIN
        `Categoria beni transazioni` CB1 ON IV1.Transazione = CB1.Transazione
    WHERE
        Voto < 3;
    
    
    SELECT DISTINCT
        AC1.Acquirente, AC2.Acquirente
    FROM
        `Acquirente-Categoria` AC1
            JOIN
        `Acquirente-Categoria` AC2 ON AC1.Categoria = AC2.Categoria
    WHERE
        AC1.Acquirente <> AC2.Acquirente AND AC1.Categoria = AC2.Categoria;
    Query2
    codice:
     
    SELECT DISTINCT
        IV1.Acquirente,
        IV1.Venditore,
        IV1.Voto,
        IV2.Acquirente,
        IV2.Venditore,
        IV2.Voto
    FROM
        `Info voti` IV1
            JOIN
        Transazione T1 ON IV1.Transazione = T1.`Codice transazione`
            JOIN
        (
         `Info voti` IV2
             JOIN 
          Transazione T2 ON IV2.Transazione = T2.`Codice transazione`
        ) 
        ON T1.Venditore = T2.Venditore
    WHERE
        IV1.Voto < 3 
        AND IV2.Voto < 3 
        AND IV1.Acquirente = IV2.Acquirente 
        AND IV1.Transazione <> IV2.Transazione
    ;
    Query3
    codice:
    SELECT 
        Venditore,
        `Città fatturazione` AS `Città`,
        COUNT(DISTINCT Acquirente) `Voti positivi`
    FROM
        `Info voti` IV1
            JOIN
        Acquirente A1 ON IV1.Acquirente = A1.`Codice acquirente`
    WHERE
        Voto > 3
    GROUP BY `Città fatturazione`
    HAVING `Voti positivi` > 1
    ;
    Ringrazio in anticipo chi vorrà aiutarmi

  2. #2
    nessuno???

  3. #3
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    954
    Originariamente inviato da tigerjack89
    nessuno???
    Query 1:
    codice:
    SELECT *
    FROM Acquirenti A
    WHERE EXISTS
    	(
    		SELECT 'x'
    		FROM Feedback F
    		JOIN Transazioni T
    			ON T.id = F.id_transazione
    		JOIN Offerta O
    			ON O.id = T.id_offerta
    		JOIN Composizione C
    			ON C.id_offerta = O.id
    		JOIN Afferenza AF
    			ON AF.id_bene = C.id_bene
    		WHERE F.id_acquirente = A.id
    		AND F.voto < 3
    		AND AF.Categoria = 'MIA CATEGORIA'
    	)
    La query estrae tutti gli acquirenti per i quali esiste un feedback in una transazione di un bene di una fissata categoria con voto < 3.

    Un consiglio, evita di usare spazi all'interno di definizione di viste, campi, tabelle etc.

    Se riesco ti vedo le altre query

  4. #4
    Grazie mille, gentilissimo
    E' tutta un'altra cosa senza tutte quelle viste
    Appena torno a casa la controllo meglio, ma grazie comunque per l'aiuto.

  5. #5
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    954
    Originariamente inviato da tigerjack89
    nessuno???
    Query 2:
    Dovrebbe essere così
    codice:
    SELECT DISTINCT V.id, A.id
    FROM Venditori V
    JOIN Transazioni T
    	ON V.id = T.id_Venditore
    JOIN Acquirenti A
    	ON A.id = T.id_acquirente
    WHERE 
    	(SELECT COUNT(*)
    	FROM Transazioni T1
    	JOIN Feedback F
    		ON T1.id = F.id_transazione
    	WHERE T1.id_venditore = V.id
    	AND F.voto < 3
    	AND A.id = T1.id_acquirente
    	) > 1
    Ovviamente la 3 la puoi scrivere simile alla 2

  6. #6
    Allora, prima di tutto grazie ancora per i consigli e l'aiuto.
    Comunque, ho provato a usara la prima query mettendo i nomi giusti alle variabili, ma non funziona e non da output. Inoltre, l'esercizio purtroppo non mi chiede di usare una determinata categoria (come 'MIA CATEGORIA' per esempio) ma quelli che hanno acquistato beni della stessa categoria; ovvero la categoria del bene acquistato da un acquirente è identica a quella acquistata da un altro.

    La seconda, invece, non può funzionare semplicemente perchè in Transazione non è definito l'Acquirente, nemmeno tramite l'id, per cui T.id_Acquirente non esiste.

    Parlando in generale, visto che comunque la `Info messaggi` mi tornerà poi utile nelle altre query, è giusto crearla e lasciarla li? Oppure una query semplice è più performante?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.