Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    121

    [C#] Problema con query...

    Salve a tutti!

    Diciamo che ho un database organizzato in questo modo:

    Tabella "Ingredienti" (idIngrediente come PK)
    Tabella "Ricette" (idRicetta come PK)
    Tabella "Ing_Ric" (idIng_Ric, idIngrediente, idRicetta tutte come PK).
    Ovviamente, la tabella Ing_Ric mi serve per "bindare" gli ingredienti ad una ricetta (per evitare che all'eliminazione di un ingrediente, vengano eliminate pure le ricette che lo contengono, insomma... per rendere il DB in terza forma normale ed evitare le dangling references).

    Se volessi fare una query di tipo SELECT di tutte le ricette che contengono determinati ingredienti, farei così:

    SELECT ricette.idRicetta, ricette.nomeRicetta FROM ingredienti, ricette, ing_ric WHERE ingredienti.idIngrediente = ing_ric.idIngrediente AND ricette.idRicetta = ing_ric.idRicetta AND ing_ric.idIngrediente = 1;

    Diciamo che 1 sarebbe l'aglio, 2 la cipolla e 3 i peperoni (tanto per fare una cenetta leggera leggera ).

    Se eseguo la query suddetta, i risultati corrispondono. Se aggiungo altri parametri (diciamo che la clausola WHERE diventa così: ".....AND ing_ric.idIngrediente = 1 AND ing_ric.idIngrediente = 2") non mi tira fuori alcun risultato. Ora, capisco concettualmente che idIngrediente può assumere SOLTANTO un valore, per cui non è mai verificata la condizione in cui idIngrediente è sia uguale a 1 che uguale a 2. Se usassi l'operatore OR, mi tirerebbe fuori tutte le ricette che contengono sia 1 che 2, ma la ricerca così non sarebbe più raffinata ai risultati che mi servono, ma sarebbe molto più "dispersiva", fornendomi tutte le ricette che contengono o l'aglio o la cipolla o entrambi, ma a me serve che escano solo le ricette che contengono SIA l'aglio CHE la cipolla! Non so se mi spiego...
    Che query potrei utilizzare?

    Grazie a tutti!

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    essendo una relazione N:N tra ricette e ingredienti con la relazione in mezzo per gestirla devi fare una join

    quindi sarebbe:

    SELECT ricette.idRicetta, ricette.nomeRicetta
    FROM ingredienti join ing_ric on ingredienti.idIngrediente = ing_ric.idIngrediente
    AND ing_ric join ricette on ricette.idRicetta = ing_ric.idRicetta
    WHERE ing_ric.idIngrediente = 1;

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    121
    Si, ma il problema sussiste quando devo SELECTare più ingredienti... e cioè, se volessi selezionare tutte le ricette che contengono gli ingredienti 1, 2 e 3 contemporaneamente, non solo (utlizzando l'OR) 1 o 2 o 3... come dovrei gestire la clausola WHERE?

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    121
    Cerco di spiegarmi meglio, ora che ho analizzato meglio il problema.

    Assumiamo che io abbia 3 ricette, così divise:

    Tabella ricetta:

    idRicetta = 7 nomeRicetta = Lasagne
    idRicetta = 8 nomeRicetta = Brasato
    idRicetta = 9 nomeRicetta = Frittura

    Diciamo che ho inserito i seguenti ingredienti:

    Tabella ingredienti:

    idIngrediente = 1 nomeIngrediente = aglio
    idIngrediente = 2 nomeIngrediente = cipolla
    idIngrediente = 3 nomeIngrediente = pepe
    idIngrediente = 4 nomeIngrediente = olio

    Assumiamo, per semplicità, queste associazioni:

    Tabella ing_ricette:

    idRicetta = 7 idIngrediente = 1
    idRicetta = 7 idIngrediente = 2
    idRicetta = 8 idIngrediente = 1
    idRicetta = 8 idIngrediente = 3
    idRicetta = 9 idIngrediente = 4
    idRicetta = 9 idIngrediente = 1
    idRicetta = 9 idIngrediente = 3

    per cui, avremo che le Lasagne avranno come ingrediente aglio + cipolla, il brasato avrà aglio e pepe e infine la frittura avrà olio, aglio e pepe. Dunque, tutte le ricette hanno l'aglio.
    Se io strutturassi la query in questo modo "SELECT ...... WHERE .... idIngrediente = 1 AND idIngrediente = 3" non otterrei nessun risultato (penso!) perché l'idIngrediente non può assumere due valori nello stesso momento (o è 1 oppure è 3). Per cui, non otterei, come invece mi aspetto, il brasato e la frittura.
    Se invece strutturassi la query così: "SELECT ....... WHERE .... idIngrediente = 1 OR idIngrediente = 3" otterrei tutti i risultati, perché, sebbene l'ingrediente 3 (il pepe) non sia presente in tutte le ricette, l'ingrediente 1 (l'aglio!) è invece abbinato a tutte.
    Come posso fare per ottenere tutte le ricette che contengono SOLO gli ingredienti 1 e 3?
    Ricapitolando, con l'AND non esce niente, con l'OR escono tutti, basta che sia vera una sola uguaglianza...

  5. #5
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Originariamente inviato da atsap
    Si, ma il problema sussiste quando devo SELECTare più ingredienti... e cioè, se volessi selezionare tutte le ricette che contengono gli ingredienti 1, 2 e 3 contemporaneamente, non solo (utlizzando l'OR) 1 o 2 o 3... come dovrei gestire la clausola WHERE?
    usando l'operatore IN, ovvero

    codice:
    WHERE ing_ric.idIngrediente IN (1,2,3)

    P.S. Come vedi, il codice deve essere formattato con l'apposito tag [ code ] / [ /code ]
    oppure usando il pulsantino # (come previsto dal Regolamento).


  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    121
    Chiedo venia!
    Ad ogni modo, non funziona neanche con l'operatore IN. Questa è la query che uso:

    codice:
    SELECT ricetta.idRicetta, ricetta.nomeRicetta FROM ingredienti, ricetta, ing_ricette WHERE
    ing_ricette.idRicetta = ricetta.idRicetta AND
    ing_ricette.idIngrediente = ingredienti.idIngrediente AND
    ing_ricette.idIngrediente IN (1,2)
    che viene automaticamente trasformata in

    codice:
    SELECT     ricetta.idRicetta, ricetta.nomeRicetta
    FROM         ing_ricette INNER JOIN
                          ricetta ON ing_ricette.idRicetta = ricetta.idRicetta INNER JOIN
                          ingredienti ON ing_ricette.idIngrediente = ingredienti.idIngrediente
    WHERE     (ing_ricette.idIngrediente IN (1, 2))
    E dico che non funziona perché il resultset è assurdo: mi restituisce un numero di risultati strano, ovvero mi tira fuori prima i risultati delle ricette che contengono idIngrediente pari a 1, e poi aggiunge le ricette che hanno idIngrediente pari a 2. A me invece servirebbe che uscissero solo i risultati delle ricette che hanno SIA uno che l'altro, e non uno O l'altro. E quindi sarebbe un AND, solo che non funziona... perché, ripeto, credo che idIngrediente può assumere SOLO un valore e non più valori...

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.