Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [MySQL] come ottenere record senza corrispondenze con una sola query

    Ciao a tutti!
    Il mio problema è il seguente:
    ho 2 tabelle, una (Acquisti) che contiene i nomi delle persone e i codici dei prodotti che hanno acquistato, un'altra che contiene la lista dei codici dei prodotti (Prodotti).

    Acquirente codprod
    MAX 1
    MAX 3
    GIO 4
    GIO 1

    codprod
    1
    2
    3
    4
    5

    Secondo voi è possibile ottenere con una sola query la coppia di valori persona - prodotto non acquistato? E se sì come?
    Ho provato con "SELECT Prodotti.codprod, Acquisti.codprod, Acquisti.nomeFROM Prodotti LEFT JOIN Acquisti ON Acquisti.codprod=Prodotti.codprod" ma, come mi aspettavo, non ha funzionato.
    Purtroppo il LEFT JOIN non mi restituisce quello che vorrei in quanto per esempio non evidenzia che GIO non ha il prodotto numero 4.
    Ho precisato con una sola query perché so che è possibile con più query che prendono in considerazione un'acquirente alla volta...

  2. #2
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955

    Re: [MySQL] come ottenere record senza corrispondenze con una sola query

    Originariamente inviato da ipermax87
    Ciao a tutti!
    Il mio problema è il seguente:
    ho 2 tabelle, una (Acquisti) che contiene i nomi delle persone e i codici dei prodotti che hanno acquistato, un'altra che contiene la lista dei codici dei prodotti (Prodotti).

    Acquirente codprod
    MAX 1
    MAX 3
    GIO 4
    GIO 1

    codprod
    1
    2
    3
    4
    5

    Secondo voi è possibile ottenere con una sola query la coppia di valori persona - prodotto non acquistato? E se sì come?
    Ho provato con "SELECT Prodotti.codprod, Acquisti.codprod, Acquisti.nomeFROM Prodotti LEFT JOIN Acquisti ON Acquisti.codprod=Prodotti.codprod" ma, come mi aspettavo, non ha funzionato.
    Purtroppo il LEFT JOIN non mi restituisce quello che vorrei in quanto per esempio non evidenzia che GIO non ha il prodotto numero 4.
    Ho precisato con una sola query perché so che è possibile con più query che prendono in considerazione un'acquirente alla volta...
    Ma esiste un'altra tabella con il solo nome delle persone? Altrimenti non puoi fare nulla

  3. #3
    Si esiste... ma anche non esistesse non vedo dove sarebbe il problema: potrei usare un SELECT DISTINCT sulla tabella degli acquisti, o sbaglio? cmq hai idee? io non so più cosa inventarmi...

  4. #4
    metti tutto in JOIN (LEFT JOIN, mi raccomando) e poi estrai i record con codprodotto e codpersona a NULL

  5. #5
    Ma così come faccio a sapere se un utente ha acquistato un prodotto che invece un altro ha acquistato? quello che voglio dire è che il LEFT JOIN mi aiuta a trovare solo i prodotti che non sono stati acquistati da nessuno. io invece vorrei le coppie acquirente-prodotto non acquistato!

  6. #6
    basi questa tua affermazione su un'esperienza pratica o stai solo facendo supposizioni?

  7. #7
    esperienza.
    Per sicurezza ho rifatto come dici tu.
    ecco cosa mi restituisce la QUERY che dici:

    1 1 GIO
    1 1 MAX
    2 NULL NULL
    3 3 MAX
    4 4 GIO
    5 NULL NULL

    Per intenderci la QUERY è:

    SELECT prodotti.codprod, acquisti.codprod, acquisti.acquirente
    FROM prodotti
    LEFT JOIN acquisti ON acquisti.codprod = prodotti.codprod

    Come vedi il problema è che non mi fornisce le coppie "acquirente - prodotto NON acquistato"... perché me le mette GIUSTAMENTE a NULL...

    Concettualmente non dovrebbe essere difficile, il fatto è che non trovo il comando giusto... o forse semplicemente non è possibile farlo con una sola istruzione SQL...

  8. #8
    A chi fosse interessato per ora ho trovato questa soluzione:

    QUERY DEF

    SELECT P.user, P.id
    FROM (
    SELECT id, user
    FROM prodotti
    JOIN acquirenti
    WHERE user = 'MAX'
    ) AS P
    LEFT JOIN (
    SELECT *
    FROM acquisti
    WHERE nome = 'MAX'
    ) AS A ON A.id = P.id
    WHERE A.id IS NULL

    UNION

    .... [cambio nome e user con 'GIO', ecc...]
    non è il massimo lo so e non so quanto sia più veloce rispetto a tante query diverse cmq per ora adotto questa.

  9. #9
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Originariamente inviato da ipermax87
    Si esiste... ma anche non esistesse non vedo dove sarebbe il problema:
    potrei usare un SELECT DISTINCT sulla tabella degli acquisti, o sbaglio?
    cmq hai idee? io non so più cosa inventarmi...
    A mio parere JorTaras non sbaglia quando dice che ti serve
    la tabella degli utenti

    Se tu fai un SELECT DISTINCT sulla tabella acquisti
    ti perdi tutti gli utenti che non hanno mai
    acquistato nulla, quindi non compaiono nella tabella acquisti

    ( potrebbe essere una cosa voluta ma questo lo sai solo te )

    __________________________________________________ _______________
    __________________________________________________ _______________
    __________________________________________________ _______________
    __________________________________________________ _______________


    Se hai queste 3 tabelle
    ( i nomi li ho desunti dalle tue 2 query postate )

    ___ acquirenti
    _____ user ______ Testo

    ___ Prodotti
    _____ codprod ___ Testo

    ___ Acquisti
    _____ nome ______ Testo
    _____ codprod ___ Testo

    Con 2 relazioni
    __ acquirenti.user ------> Acquisti.nome
    __ Prodotti.codprod -----> Acquisti.codprod

    __________________________________________________ ________________


    Io farei una prima vista fra acquirenti e Prodotti
    che mi restituisce tutti gli user e tutti i codprod
    ( 5 user e 8 codprod fanno 40 record restituiti )


    poi metterei in LEFT JOIN questa prima vista
    con la tabella Acquisti filtrando i valori Null
    su Acquisti.nome

    Poi nidifichi le 2 viste l'una nell'altra


    Sei arrivato al risultato



    __________________________________________________ _____________
    __________________________________________________ _____________
    __________________________________________________ _____________
    __________________________________________________ _____________


    Seguono 2 esempi
    ( con il SELECT DISTINCT su Acquisti e con la tabella acquirenti )
    NON testati perche non ho MySql quindi
    poresti avere degli errori di sintassi da correggere

    codice:
    SELECT 
    S1.nome, 
    S1.codprod
    FROM
    (
    SELECT DISTINCT 
    Acquisti.nome, 
    Prodotti.codprod
    FROM 
    Acquisti, 
    Prodotti
    ) AS S1 
    LEFT JOIN 
    Acquisti 
    ON 
    (S1.nome = Acquisti.nome) 
    AND 
    (S1.codprod = Acquisti.codprod)
    WHERE (((Acquisti.nome) Is Null))
    ;
    codice:
    SELECT 
    T1.user, 
    T1.codprod
    FROM
    (
    SELECT 
    acquirenti.user, 
    Prodotti.codprod
    FROM 
    Prodotti, 
    acquirenti
    ) AS T1 
    LEFT JOIN 
    Acquisti 
    ON 
    (T1.codprod = Acquisti.codprod) 
    AND 
    (T1.user = Acquisti.nome)
    WHERE (((Acquisti.nome) Is Null))
    ;

    Facci sapere

  10. #10
    vai con questa

    SELECT TX.Persona, TX.Prodotto, TA.IDAcquisto, TA.Persona, TA.Prodotto
    FROM Acquisti TA RIGHT JOIN
    (SELECT * FROM PERSONE, PRODOTTI) TX
    ON TX.Persona=TA.Persona AND TX.Prodotto=TA.Prodotto

    adattala al tuo caso


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.