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

    Query inner join 3 tabelle dato mancante

    Ho bisogno di una query con INNER JOIN di 3 tabelle che mi mostri il record mancante combinando dati dalle 3 tabelle. Questo è il quadro della questione:

    utenti
    +----------+------+
    |id_utente | nome |
    +----------+------+
    | 1 |Mario |
    +----------+------+
    | 2 |Anna |
    +--------- +------+

    prodotti
    +---------- +----------+
    |id_prodotto | nome |
    +-----------+----------+
    | 2 | birra |
    +-----------+----------+
    | 3 | acqua |
    +-----------+----------+

    spesa
    +---+------------+-----------+
    |id | id_prodotto | id_utente |
    +----------------+-----------+
    | 1 | 1 | 1 |
    +----------------+-----------+
    | 2 | 2 | 1 |
    +----------------+-----------+
    | 3 | 1 | 2 |
    +----------------+-----------+

    Como faccio a ricavare il risultato sotto: quale prodotto non è stato acquistato dall'utente Anna?

    spesa_prodotto_utente
    +---+------------+-----------+
    |id |id_prodotto | id_utente |
    +--------------+-----------+
    | 1 | 2 | 2 |
    +----------------+---------+
    Luiz

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

    Re: Query inner join 3 tabelle dato mancante

    Originariamente inviato da ldarosa
    Ho bisogno di una query con INNER JOIN di 3 tabelle che mi mostri il record mancante combinando dati dalle 3 tabelle. Questo è il quadro della questione:

    utenti
    +----------+------+
    |id_utente | nome |
    +----------+------+
    | 1 |Mario |
    +----------+------+
    | 2 |Anna |
    +--------- +------+

    prodotti
    +---------- +----------+
    |id_prodotto | nome |
    +-----------+----------+
    | 2 | birra |
    +-----------+----------+
    | 3 | acqua |
    +-----------+----------+

    spesa
    +---+------------+-----------+
    |id | id_prodotto | id_utente |
    +----------------+-----------+
    | 1 | 1 | 1 |
    +----------------+-----------+
    | 2 | 2 | 1 |
    +----------------+-----------+
    | 3 | 1 | 2 |
    +----------------+-----------+

    Como faccio a ricavare il risultato sotto: quale prodotto non è stato acquistato dall'utente Anna?

    spesa_prodotto_utente
    +---+------------+-----------+
    |id |id_prodotto | id_utente |
    +--------------+-----------+
    | 1 | 2 | 2 |
    +----------------+---------+
    Non devi usare una inner join (che ti da l'opposto di quello che vuoi) ma una not exists

  3. #3
    Ho provato con questa query usando NOT EXISTS ma OUTPUT non è quello desiderato
    NB.: Ho messo come parametro nella query l'utente 2, perché vorrei sapere cosa l'utente "2" non ha acquistato.

    Codice PHP:
    SELECT FROM prodotti JOIN utenti WHERE NOT EXISTS (SELECT FROM spesa WHERE spesa.id_prodotto prodotto.id_prodotto AND spesa.id_utente '2'
    Con questa query ho come output il prodotto che utente 2 (Anna) non ha acquistato, ma perchè me lo da 2 volte?

    +-----------+---------+-------------+-----------|
    |id_prodotto|id_utente|nome_prodotto|nome_utente|
    +-----------+---------+-------------+-----------|
    3 2 acqua Anna
    +-----------+---------+-------------+-----------|
    3 2 acqua Anna
    +-----------+---------+-------------+-----------|
    Luiz

  4. #4
    io userei il NOT IN
    codice:
    select nome from prodotti where id_prodotto not in (SELECT Spesa.id_prodotto  
          FROM Utenti LEFT JOIN Spesa ON Utenti.ID_utente = Spesa.id_utente 
          WHERE Utenti.ID_utente=2);
    Non hai detto il db usato, per comodità la query l'ho fatta in access e sembra funzionare

  5. #5
    Grazie Nettuno95! La tua query anche in MySQL (mio caso) funziona alla grande
    codice:
    select * from prodotti 
    where id_prodotto not in 
    (SELECT Spesa.id_prodotto FROM Utenti 
    LEFT JOIN Spesa ON Utenti.ID_utente = Spesa.id_utente 
    WHERE Utenti.ID_utente=2);
    Luiz

  6. #6
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955
    Originariamente inviato da ldarosa
    Grazie Nettuno95! La tua query anche in MySQL (mio caso) funziona alla grande
    codice:
    select * from prodotti 
    where id_prodotto not in 
    (SELECT Spesa.id_prodotto FROM Utenti 
    LEFT JOIN Spesa ON Utenti.ID_utente = Spesa.id_utente 
    WHERE Utenti.ID_utente=2);
    Prova questa perché la NOT IN con il NULL a volte non funziona come dovrebbe:
    codice:
    SELECT u.id_utente, p.id_prodotto
    FROM utenti u
    CROSS JOIN prodotti p
    WHERE NOT EXISTS
    	(SELECT 'X' 
    	FROM spesa s
    	WHERE s.id_prodotto = p.id_prodotto
    	AND s.id_utente = u.id_utente)

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.