3 messaggi dal 23 giugno 2012
Salve, ho un piccolo problema, vado subito al sodo.
Ho un database così definito:

ricette(idRicetta,nomeRic,...)
ingredienti (idIngrediente,nomeIngr,...)
composizione(ricetta, ingredienti, quantità,...)
ricetta riferisce a idRicetta, ingredienti riferisce a idIngrediente.

Devo fare una query per trovare quali ricette poter comporre a partire da alcuni elementi di cui so la chiave.
Pensavo ad un

SELECT * FROM
ricette JOIN composizione ON (idRicetta = nomeRic)
GROUP BY ricetta
HAVING
NOT EXIST ricetta /*una tupla del join, non credo sia corretto qui*/
WHERE ingrediente != 'id passato dal programma' OR
ingrediente != 'un id passato dal programma' OR
ingrediente != 'un id passato dal programma' OR
...
ingrediente != 'un id passato dal programma'

E poi in teoria ci sarebbe da fare un'altra query simile a questa ma che permette di usare "qualche" ingrediente qualsiasi oltre a quelli dati, che credo sia uguale a quella sopra (nel caso sia corretta, cosa che dubito visto che non funziona).
E mi servirebbe che funzionasse in Sqlite.
Grazie mille!
57 messaggi dal 24 marzo 2008
Ciao Federik,
potresti utilizzare una query di questo tipo:


SELECT ricette.IdRicetta, ricette.NomeRicetta
FROM ricette
INNER JOIN composizione ON (composizione.IdRicetta = ricette.IdRicetta)
WHERE composizione.IdIngrediente IN (.....)
GROUP BY ricette.IdRicetta, ricette.NomeRicetta



la clausola IN ti consente di specificare più di un valore (separato da virgola) di conseguenza verranno estratte tutte le ricette (id e nome) in cui è presente almeno un ingrediente tra quelli specificati

Ad esempio:


composizione.IdIngrediente IN (3, 32, 12, 5)



Per passare i codici alla query potresti creare una lista con tutti gli ingredienti, dare la possibilità all'utente di selezionare quelli che vuole, e poi costruire la lista di codici separati da virgola in base ai soli ingredienti selezionati (prelevandone il relativo id)

Purtroppo non conosco Sqlite e non ti so dire se la query funzioni oppure no, in ogni caso prova a prenderla come spunto per le tue esigenze :)

Fammi sapere,
Davide

Nulla è reale...tutto è lecito...
3 messaggi dal 23 giugno 2012
Non è esattamente quello che volevo: mi dice le ricette che posso fare con gli elementi a disposizione ma anche quelle che non posso fare che hanno almeno un ingrediente da me passato.

Mi andrebbe anche bene se ci fosse un modo di ordinare i risultati in modo che le ricette che posso fare vengano prima delle altre.

Grazie comunque!
57 messaggi dal 24 marzo 2008
Ciao Federik,
quindi la query dovrebbe anche controllare, oltre che la presenza di ricette rispondenti agli ingredienti che scegli, anche quelle che potresti "completare" con gli ingredienti scelti.

Giusto? :)

Nulla è reale...tutto è lecito...
57 messaggi dal 24 marzo 2008
Prova una query di questo tipo:


SELECT r.IdRicetta, 
r.NomeRicetta,
((SELECT COUNT(cq.IdIngrediente)
FROM Composizioni cq 
INNER JOIN Ricette rq ON (cq.IdRicetta = rq.IdRicetta)
WHERE cq.IdRicetta = r.IdRicetta) -
COUNT(c.IdIngrediente)) AS IngredientiMancanti
FROM Ricette r
INNER JOIN composizioni c ON (c.IdRicetta = r.IdRicetta)
WHERE c.IdIngrediente IN (...)
GROUP BY r.IdRicetta, r.NomeRicetta
ORDER BY IngredientiMancanti, r.NomeRicetta



Rispetto alla precedente ho aggiunto un campo calcolato che è la differenza tra il totale degli ingredienti per quella ricetta ed il numero di ingredienti estratti dalla query.

L'idea sarebbe che, se la differenza è zero, la query ha estratto tutti gli ingredienti di quella ricetta e quindi è "completabile", mentre non è completabile in tutti gli altri casi.

Ho impostato un order by decrescente sul campo calcolato in modo da farti vedere per prime quelle completabili.

Che ne pensi?

Davide
Modificato da dadox77 il 23 giugno 2012 14.15 -

Nulla è reale...tutto è lecito...
3 messaggi dal 23 giugno 2012
Perfetto! Grazie mille Davide! Su un DB di 5 ingredienti e 5 ricette funziona perfettamente, anche su sqlite3!
57 messaggi dal 24 marzo 2008
Ottimo, sono contento che ti sia utile.
a presto ;)

Nulla è reale...tutto è lecito...

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.