Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy?
Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy?
Google Pixel 10 è uno smartphone che unisce una fotocamera molto più versatile rispetto al passato grazie allo zoom ottico 5x, il supporto magnetico Pixelsnap e il nuovo chip Tensor G5. Il dispositivo porta Android 16 e funzionalità AI avanzate come Camera Coach, mantenendo il design caratteristico della serie Pixel con miglioramenti nelle prestazioni e nell'autonomia. In Italia, però, mancano diverse feature peculiari basate sull'AI.
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
L'abbonamento Ultimate di GeForce NOW ora comprende la nuova architettura Blackwell RTX con GPU RTX 5080 che garantisce prestazioni tre volte superiori alla precedente generazione. Non si tratta solo di velocità, ma di un'esperienza di gioco migliorata con nuove tecnologie di streaming e un catalogo giochi raddoppiato grazie alla funzione Install-to-Play
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Deebot X11 Omnicyclone implementa tutte le ultime tecnologie Ecovacs per l'aspirazione dei pavimenti di casa e il loro lavaggio, con una novità: nella base di ricarica non c'è più il sacchetto di raccolta dello sporco, sostituito da un aspirapolvere ciclonico che accumula tutto in un contenitore rigido
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-07-2009, 13:31   #1
silvia_m
Junior Member
 
Iscritto dal: Jul 2008
Messaggi: 21
[access]Problema query con 'NOT LIKE'

Salve, sto lavorando ad un db di ricette con access e vorrei creare una query di ricerca delle ricette che NON contengano un determinato ingrediente ma che facciano parte di una certa categoria (es. tutte le ricette del tipo Biscotti che non contengono ricotta).

Le tabelle sono così strutturate:

- ricetta (id, id_tipo (FK))
- ingredienti (id)
- ingredientiRicetta (ID,id_ricetta (FK),id_ingredienti (FK))
- tipo (id)


ho creato una query con il not like ma non funziona perché mi esclude l’ingrediente (selezionato come parametro esterno) ma non la ricetta che lo contiene.

Come potrei risolvere questo problema?

Grazie in anticipo
Ciao
Silvia
silvia_m è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2009, 14:37   #2
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quale query hai scritto?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2009, 14:59   #3
silvia_m
Junior Member
 
Iscritto dal: Jul 2008
Messaggi: 21
la query è questa, ma considera che ci sono anche altre tabelle coinvolte:

SELECT DISTINCTROW [Indice ricette].id, [Indice ricette].titolo, [Indice ricette].pagina, dox.descrizione, tipologia.tipologia, [Indice ricette].foto, [Indice ricette].istruzioni
FROM Ingredienti INNER JOIN ((dox INNER JOIN (tipologia INNER JOIN [Indice ricette] ON tipologia.id_tipo = [Indice ricette].tipologia) ON dox.id_dox = [Indice ricette].dox) INNER JOIN IngredientiRicetta ON [Indice ricette].id = IngredientiRicetta.IDRicetta) ON Ingredienti.IDIngrediente = IngredientiRicetta.IDIngrediente
WHERE (((Ingredienti.Ingrediente) Not Like ("*" & [param] & "*")) AND (([Indice ricette].tipologia)=[param2])) OR ((([Indice ricette].tipologia1)=[param2])) OR ((([Indice ricette].tipologia2)=[param2]));
silvia_m è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2009, 15:13   #4
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Devi scrivere una query a mano, non con il compositore di Access.

Dovrai scrivere una query che in Italiano suona come:
Selezionare tutte le ricette che facciano parte di una categoria X data, ma che non contengano neppure una volta l'ingrediente Y.

Dove quel "neppure una volta" si traduce con la clausola NOT EXISTS
Qualcosa come

Codice:
SELECT * FROM RICETTE
WHERE categoria = 'X'
AND NOT EXISTS (
     SELECT 1 FROM Ingredienti WHERE Ricette.IDRicetta=Ingredienti.IDRicetta
         AND Ingredienti.Nome LIKE 'asdf%'
)
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2009, 15:15   #5
silvia_m
Junior Member
 
Iscritto dal: Jul 2008
Messaggi: 21
ci avevo provato senza il compositore, usando una select dentro una select. non conoscevo però il costrutto 'not exists'..
ci provo subito...
in ogni caso grazie!!!!
silvia_m è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2009, 15:46   #6
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da silvia_m Guarda i messaggi
Salve, sto lavorando ad un db di ricette con access e vorrei creare una query di ricerca delle ricette che NON contengano un determinato ingrediente ma che facciano parte di una certa categoria (es. tutte le ricette del tipo Biscotti che non contengono ricotta).
Le tabelle sono così strutturate:

- ricetta (id, id_tipo (FK))
- ingredienti (id)
- ingredientiRicetta (ID,id_ricetta (FK),id_ingredienti (FK))
- tipo (id)
Basandomi strettamente sullo schema del DB, e sulla domanda specifica, eviterei l'uso del Like.
Dal momento che hai giustamente definito una tabella di raccordo IngredientiRicetta, per tagliare la relazione Molti-Molti tra
Ricetta e Ingredienti, usiamo quella.
Inoltre noto che in pratica i tuoi vari id sono chiavi e al tempo stesso descrizione dell'entità che rappresentano ( in pratica non fai un id numerico + descrizione-testo ), perciò la risolverei così :

Codice:
SELECT DISTINCT Ricetta.id, Ricetta.id_tipo FROM Ricetta, IngredientiRicetta
WHERE Ricetta.id = IngredientiRicetta.id_ricetta
AND Ricetta.id_tipo = 'Biscotti' 
AND NOT EXISTS ( SELECT 1 FROM IngredientiRicetta 
                 WHERE Ricetta.id = IngredientiRicetta.id_ricetta
                 AND IngredientiRicetta.id_ingredienti = 'ricotta' )
Prova...
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2009, 07:35   #7
silvia_m
Junior Member
 
Iscritto dal: Jul 2008
Messaggi: 21
Siete fantastici!!!!!! Grazie!!!!!

Non conoscevo la clausola EXISTS che invece mi ha risolto tutto!

P.S. Per Marco: la clausola like la devo lasciare perchè la ricerca tra gli ingredienti è la più varia (es. esiste farina ma anche farina tipo 00)
Ecco la query finalmente funzionante...

SELECT [Indice ricette].id, [Indice ricette].titolo
FROM [Indice ricette]
WHERE [Indice ricette].tipologia=[param2] or ([Indice ricette].tipologia1=[param2] or [Indice ricette].tipologia2=[param2])
and not exists
(select 1 from ingredienti, ingredientiricetta
where ingredienti.idingrediente=ingredientiricetta.idingrediente
and ingredienti.ingrediente like '*' & [param] & '*');
silvia_m è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2009, 10:29   #8
silvia_m
Junior Member
 
Iscritto dal: Jul 2008
Messaggi: 21
Quote:
Originariamente inviato da MarcoGG Guarda i messaggi
Basandomi strettamente sullo schema del DB, e sulla domanda specifica, eviterei l'uso del Like.
Dal momento che hai giustamente definito una tabella di raccordo IngredientiRicetta, per tagliare la relazione Molti-Molti tra
Ricetta e Ingredienti, usiamo quella.
Inoltre noto che in pratica i tuoi vari id sono chiavi e al tempo stesso descrizione dell'entità che rappresentano ( in pratica non fai un id numerico + descrizione-testo ), perciò la risolverei così :

Codice:
SELECT DISTINCT Ricetta.id, Ricetta.id_tipo FROM Ricetta, IngredientiRicetta
WHERE Ricetta.id = IngredientiRicetta.id_ricetta
AND Ricetta.id_tipo = 'Biscotti' 
AND NOT EXISTS ( SELECT 1 FROM IngredientiRicetta 
                 WHERE Ricetta.id = IngredientiRicetta.id_ricetta
                 AND IngredientiRicetta.id_ingredienti = 'ricotta' )
Prova...

...come non detto...
non funziona bene perchè la descrizione dell'ingrediente sta nella tabella ingrediente... mi dà molti più record di quanti me ne aspetti....
silvia_m è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2009, 10:45   #9
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da silvia_m Guarda i messaggi
...come non detto...
non funziona bene perchè la descrizione dell'ingrediente sta nella tabella ingrediente... mi dà molti più record di quanti me ne aspetti....
Ma di cosa hai bisogno, di un elenco di ricette o di un elenco di ingredienti?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2009, 10:49   #10
silvia_m
Junior Member
 
Iscritto dal: Jul 2008
Messaggi: 21
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
Ma di cosa hai bisogno, di un elenco di ricette o di un elenco di ingredienti?
elenco di ricette (selezionate per tipo) che non contengano un determinato ingrediente...
silvia_m è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2009, 11:02   #11
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da silvia_m Guarda i messaggi
...come non detto...
non funziona bene perchè la descrizione dell'ingrediente sta nella tabella ingrediente... mi dà molti più record di quanti me ne aspetti....
Invece funziona.
Se vuoi posto un DB Access di prova che lo dimostra.
Bisogna solo intendersi sullo schema del DB. Tu hai postato questo schema :

- ricetta (id, id_tipo (FK))
- ingredienti (id)
- ingredientiRicetta (ID,id_ricetta (FK),id_ingredienti (FK))

- tipo (id)

Se in Ingredienti c'è un solo campo "id", mi sembra chiaro che non può essere un id numerico, sennò gli ingredienti sarebbero numeri puri, perciò ho ipotizzato che le tue chiavi primarie ( e relative FK ) fossero di tipo testo e contenessero il nome stesso ( che deve essere univoco ) dell'ingrediente, o della ricetta, e così via...

Come già scritto, ho postato quella query attenendomi fedelmente a quello schema del DB, se ora lo schema del DB è cambiato dovrai adattare la query di conseguenza...
In ogni caso è sempre difficile suggerire query di qualsiasi genere, finchè non è chiaro e definito una volta per tutte lo schema.
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2009, 11:06   #12
silvia_m
Junior Member
 
Iscritto dal: Jul 2008
Messaggi: 21
Quote:
Originariamente inviato da MarcoGG Guarda i messaggi
Invece funziona.
Se vuoi posto un DB Access di prova che lo dimostra.
Bisogna solo intendersi sullo schema del DB. Tu hai postato questo schema :

- ricetta (id, id_tipo (FK))
- ingredienti (id)
- ingredientiRicetta (ID,id_ricetta (FK),id_ingredienti (FK))

- tipo (id)

Se in Ingredienti c'è un solo campo "id", mi sembra chiaro che non può essere un id numerico, sennò gli ingredienti sarebbero numeri puri, perciò ho ipotizzato che le tue chiavi primarie ( e relative FK ) fossero di tipo testo e contenessero il nome stesso ( che deve essere univoco ) dell'ingrediente, o della ricetta, e così via...

Come già scritto, ho postato quella query attenendomi fedelmente a quello schema del DB, se ora lo schema del DB è cambiato dovrai adattare la query di conseguenza...
In ogni caso è sempre difficile suggerire query di qualsiasi genere, finchè non è chiaro e definito una volta per tutte lo schema.
Hai ragione, scusate...

la tabella ingredienti (id, descrizione)
es, id=1 desc=farina tipo 0
id=2 desc=farina tipo 00 ecc, ecc
ed ecco perchè ho necessità di usare il like...
silvia_m è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2009, 11:22   #13
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da silvia_m Guarda i messaggi
Hai ragione, scusate...

la tabella ingredienti (id, descrizione)
es, id=1 desc=farina tipo 0
id=2 desc=farina tipo 00 ecc, ecc
ed ecco perchè ho necessità di usare il like...
Allora, ammettendo che questa sia l'unica modifica allo schema precedente :

Codice:
SELECT DISTINCT Ricetta.id, Ricetta.id_tipo
FROM Ricetta, IngredientiRicetta, Ingredienti
WHERE Ricetta.id = IngredientiRicetta.id_ricetta
AND IngredientiRicetta.id_ingredienti = Ingredienti.id  
AND Ricetta.id_tipo = 'Biscotti' 
AND NOT EXISTS ( SELECT 1 FROM IngredientiRicetta, Ingredienti
                          WHERE Ricetta.id = IngredientiRicetta.id_ricetta
                          AND IngredientiRicetta.id_ingredienti = Ingredienti.id
                          AND Ingredienti.descrizione LIKE 'ricotta' );
A ri-prova...
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2009, 11:35   #14
silvia_m
Junior Member
 
Iscritto dal: Jul 2008
Messaggi: 21
non risponde... rimane in esecuzione e basta...
silvia_m è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2009, 12:50   #15
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da silvia_m Guarda i messaggi
non risponde... rimane in esecuzione e basta...
Da me funziona, ma evidentemente ci sono ancora differenze di schema che non hai chiarito ( giudicando dalla query al tuo post #3... ).
Quando si fanno domande come la tua deve essere CHIARO lo schema, sennò è tutto inutile.
Altro consiglio : evita gli spazi nelle definizioni a livello del DB :
[Indice ricette] >> IndiceRicette, o Indice_ricette.
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2009, 13:03   #16
silvia_m
Junior Member
 
Iscritto dal: Jul 2008
Messaggi: 21
Funziona!
Ho solo dovuto togliere
WHERE [Indice ricette].tipologia=[param2] or ([Indice ricette].tipologia1=[param2] or [Indice ricette].tipologia2=[param2])
la parte in rosso (sono campi che ho ereditato dalla vecchia versione di access che non aveva i campi multivalore).
Funziona perfettamente cercando per tipo principale!
GRAZIE!!!!!

P.S. Per gli spazi nel nome tabella, non sai quanto li sto maledicendo.....
...peccato che per access non esista un bel refactor....
silvia_m è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2009, 14:09   #17
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da silvia_m Guarda i messaggi
P.S. Per gli spazi nel nome tabella, non sai quanto li sto maledicendo.....
Eh, lo so... Se ne accorgono tutti quando è troppo tardi...
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2009, 07:27   #18
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Per avere un elenco di ricette, non bisogna fare la JOIN con gli ingredienti.
Dovrebbe essere sufficiente la

Codice:
SELECT * FROM Ricetta
WHERE Ricetta.id_tipo = 'Biscotti' 
AND NOT EXISTS ( SELECT 1 FROM IngredientiRicetta 
                 WHERE Ricetta.id = IngredientiRicetta.id_ricetta
                 AND IngredientiRicetta.id_ingredienti = 'ricotta' )
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2009, 08:47   #19
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
Per avere un elenco di ricette, non bisogna fare la JOIN con gli ingredienti.
Dovrebbe essere sufficiente la

Codice:
SELECT * FROM Ricetta
WHERE Ricetta.id_tipo = 'Biscotti' 
AND NOT EXISTS ( SELECT 1 FROM IngredientiRicetta 
                 WHERE Ricetta.id = IngredientiRicetta.id_ricetta
                 AND IngredientiRicetta.id_ingredienti = 'ricotta' )
Ma poi lo schema è cambiato, perciò IngredientiRicetta.id_ingredienti è diventato un numero ( FK di id su Ingredienti ). Il nome dell'ingrediente adesso sta in Ingredienti.descrizione...
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2009, 08:49   #20
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da MarcoGG Guarda i messaggi
Ma poi lo schema è cambiato, perciò IngredientiRicetta.id_ingredienti è diventato un numero ( FK di id su Ingredienti ). Il nome dell'ingrediente adesso sta in Ingredienti.descrizione...
Ok. Scopiazzo meglio allora

Codice:
SELECT *
FROM Ricetta
WHERE Ricetta.id_tipo = 'Biscotti' 
AND NOT EXISTS ( SELECT 1 FROM IngredientiRicetta, Ingredienti
                          WHERE Ricetta.id = IngredientiRicetta.id_ricetta
                          AND IngredientiRicetta.id_ingredienti = Ingredienti.id
                          AND Ingredienti.descrizione LIKE 'ricotta' );
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy? Google Pixel 10 è compatto e ha uno zoom ...
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre Prova GeForce NOW upgrade Blackwell: il cloud ga...
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco Ecovacs Deebot X11 Omnicyclone: niente più...
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
La PS6 sarà più potente del previsto: ec...
Sony svela Xperia 10 VII: è il nu...
Amazon Weekend da urlo: iPhone 16 a prez...
Spotify diffida ReVanced: chiesta la rim...
Spazzolini elettrici Oral-B iO in super ...
Samsung Galaxy Watch8 Classic e Watch7 a...
Blue Origin prosegue lo sviluppo di Blue...
Roborock Saros 10 e 10R dominano il merc...
Apple scatenata su Amazon: tutti gli sco...
Canon EOS C50 è la nuova videocam...
ASUS ProArt P16 arriva in Italia: la wor...
Fujifilm presenta l'obiettivo FUJINON GF...
Il grafene ha appena 'infranto' una legg...
Metroid Prime Beyond: arriva un trailer ...
Fujifilm GFX Eterna 55: una soluzione co...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 12:17.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v