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

    sql query???aiutoooo

    buongiorno,
    sn nuova qui
    mi sn iscritta per chiedere a voi grandi esperti un aiuto cn SQL poichè ho un esame settimana prox e la prof non mi vuole ricevereeee(maldetta!!!) ..
    allora le relazioni sn le seguenti:


    GIORNALISTA( CF, nome, Città)
    GIORNALE ( CODICE, tipologia,direttore)
    SERVIZIO (GIORNALISTA, DATA, argomento, compenso, spese giornale)

    gli attributi scritte in MAIUSC sn le chiavi
    la query sulle quali ho i dubbi sn le seguenti:

    i giornalisti che hanno effettuato solo servizi di argomento "viaggi"
    ho scritto:
    SELECT g1.*
    FROM giornalista g1
    WHERE not exist ( SELECT *
    FROM servizio s
    WHERE s.argomento= "viaggi" AND
    s.giornalista NOT IN ( SELECT g2.codice fiscale
    FROM giornalista g2
    WHERE g1.codicefiscale=
    g2.codicefiscale)
    ))
    e la seconda dice:
    i giornalisti che hanno effettuato ESATTAMENTE due servizi per OGNI giornale
    l'ho fatta:


    SELECT g.*
    FROM giornalista g
    WHERE not exist ( SELECT *
    FROM giornale gg
    WHERE gg.codice NOT IN ( SELECT s.giornale
    FROM servizio s
    WHERE s.giornalista= g.codicefiscale
    GROUP BY s.giornale
    HAVING count(*)=2
    ))

    sn corrette????perchè io nn riesco a rendermene conto.

  2. #2
    ----------------------------------------------------
    standing ovation per il titolo del thread. urge (ri)lettura attenta e consapevole del regolamento.
    ----------------------------------------------------

  3. #3
    Ciao,

    beh, un buon inizio sarebbe stata la lettura del regolamento

    Visto che le query sono relative ad una tipologia specifica di database, avresti dovuto indicarlo nel titolo o, comunque, indicarlo nel corpo del messaggio ... almeno per capire di che si parla

    Se lo indichi correggo il thread.

    A parte questo, ho riscritto le query in modo un attimo più comprensibile (non mi piace vedere il codice tutto ammucchiato )

    Qui c'è la prima query, che mi pare di capire debba solo elencare i giornalisti che hanno scritto articoli relativi all'argomento viaggi

    codice:
    SELECT
        g.*
    
    FROM
        giornalista AS g
        INNER JOIN servizio AS s ON
        (
            s.giornalista = g.codicefiscale
            AND
            s.argomento = "viaggi"
        )
    
    GROUP BY
        g.codicefiscale
    Ho usato come clausola per il group by il codice fiscale, però penso ti converrebbe assegnare un ID al giornalista e poi legare la tabella servizio al giornalista per mezzo dell'id piuttosto che per il codice fiscale cosi da:
    - evitare il remoto rischio di casi di omonimia che causerebbero una strage;
    - ottimizzare le query per sfruttare chiavi numeriche (ad esempio la primaria come valore numerico autoincrementante) cosi da aumentare la velocità di esecuzione della query di un bel pò;
    - ottimizzare le query per sfruttare le chiavi primarie che SICURAMENTE sono uniche e certe.

    qui c'è la seconda query invece la seconda query
    codice:
    SELECT
        *
    
    FROM
        (
            SELECT
                g.*,
                COUNT(*) AS giornalista_serviziscritti
    
            FROM
                giornalista AS g
                INNER JOIN servizio AS s ON
                (
                    s.giornalista = g.codicefiscale
                )
    
            GROUP BY
                g.codicefiscale
        ) AS x
    
    WHERE
        x.giornalista_serviziscritti = 2
    Ho usato una sintassi specifica di mysql (non so cosa tu stia usando) ovvero le tabelle derivate (derived tables) per effettuare la where sui risultati di un'altra select ... ma credo tu possa metterci qua l'having

    PS: nelle query che hai postato non capisco il perché del NOT EXISTS ... cosi non gli dici di estrarti i giornalisti che NON ESISTONO nel resultset della subquery ottenendo dati sbagliati?

    Originariamente inviato da optime
    ----------------------------------------------------
    standing ovation per il titolo del thread. urge (ri)lettura attenta e consapevole del regolamento.
    ----------------------------------------------------
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  4. #4

    mySql

    ho utilizzato il "not exist" poichè nelle esercitazioni che abbiamo fatto la prof diceva che nel caso si fosse presentata una query di quel genere avremmo dovuto ragionare cn la doppia negazione..
    mi scuso per il titolo (e se nn ho capito male) certo che lo puoi modificare

  5. #5
    si, vorrei sistemarlo, ma ho bisogno di sapere che piattaforma stai usando (mysql, postgresql, access, sql server, informix, db2, oracle e via dicendo ... quale tra queste )
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  6. #6
    utilizzo mysql,
    e forse dovrei spiegarmi meglio..
    riguardo le due query:

    per la prima ho utilizzato 'not exist' e 'not in' perchè mi deve restituire i giornalisti che hanno realizzato solo e solamente servizi di argomento 'viaggi', quindi supponendo che un giornalista abbia realizzato in tutto 10 servizi, se 9 sn di argomento 'viaggi' e uno di 'calcio' lo devo escludere e non lo devo restituire; ho ragionato, quindi, con una doppia negazione logica: i giornalisti per i quali non esiste un articolo (servizio) che non sia di argomento 'viaggi', cioè tutti i servizi realizzati sn di quell'argomento

    per la seconda invece deve restituire i giornalisti che hanno effettuato esattamente 2 servizi per ogni giornale: se esistono 4 testate, il giornalista mario rossi deve aver fatto 2 servizi per ognuno di essi; se mario ne ha fatto per tre testate due a testa e per l'ultima ne ha fatto 5 non lo devo restituire..anche in questo caso ho utilizzato la doppia negazione..
    spero di essermi spiegata

  7. #7
    per la prima query, se ho capito quello che devi fare, ti basta usare una INNER JOIN mettendo come condizioni sia il codice fiscale, che serve a legare il giornalista ed il servizio, sia il tipo di servizio per filtrare i servizi da estrarre

    poi su tutto ciò applichi un group by (un distinct in generale) e ottieni l'elenco dei giornalisti che hanno scritto almeno un servizio di tipo viaggi

    per la seconda, la seconda query tira fuori tutti i giornalisti ed il numero di articoli per giornalista ... quest'elenco viene inserito in una "tabella derivata" [non è una tabella vera e propria ma semplicemente l'elenco dei record usato nel from praticamente] e poi filtrato dalla select esterna che controlla il numero di servizi scritti (li potresti provare l'having)

    PS: titolo sistemato
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

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 © 2025 vBulletin Solutions, Inc. All rights reserved.