Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media
Nel Formula 1 Technology and Media Centre di Biggin Hill, la velocità delle monoposto si trasforma in dati, immagini e decisioni in tempo reale grazie all’infrastruttura Lenovo che gestisce centinaia di terabyte ogni weekend di gara e collega 820 milioni di spettatori nel mondo
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica
Il nuovo gimbal mobile DJI evolve il concetto di tracciamento automatico con tre modalità diverse, un modulo multifunzionale con illuminazione integrata e controlli gestuali avanzati. Nel gimbal è anche presente un'asta telescopica da 215 mm con treppiede integrato, per un prodotto completo per content creator di ogni livello
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce
Abbiamo provato il nuovo HUAWEI Pura 80 Pro. Parliamo di uno smartphone che è un vero capolavoro di fotografia mobile, grazie ad un comparto completo in tutto e per tutto, In questa colorazione ci è piaciuto molto, ma i limiti hardware e software, seppur in netto miglioramento, ci sono ancora. Ma HUAWEI ha fatto davvero passi da gigante per questa nuova serie Pura 80. Buona anche l'autonomia e soprattutto la ricarica rapida sia cablata che wireless, velocissima.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-07-2009, 14: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, 15: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, 15: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, 16: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, 16: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, 16: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, 08: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, 11: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, 11: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, 11: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, 12: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, 12: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, 12: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, 12: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, 13: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, 14: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, 15: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, 08: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, 09: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, 09: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


Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media Il cuore digitale di F1 a Biggin Hill: l'infrast...
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica DJI Osmo Mobile 8: lo stabilizzatore per smartph...
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce Recensione Pura 80 Pro: HUAWEI torna a stupire c...
Opera Neon: il browser AI agentico di nuova generazione Opera Neon: il browser AI agentico di nuova gene...
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi Wind Tre 'accende' il 5G Standalone in Italia: s...
Verso la fine della TV tradizionale? I g...
Cassa JBL a 39€, portatili, smartphone, ...
Cometa interstellare 3I/ATLAS: la sonda ...
Jensen Huang e Bill Dally di NVIDIA prem...
Il futuro della birra è green: H...
ECOVACS GOAT G1-2000: il robot tagliaerb...
Allarme sui bus elettrici cinesi: centin...
iPhone Fold sempre più vicino: fo...
Soundbar Samsung da 150W con subwoofer i...
Tensione tra Nexperia e la controllata c...
Samsung e il futuro della smart cleaning...
Tinder: ecco come userà l'IA (e l...
Oltre 55.000 dollari solo per il raffred...
Microsoft e tecnologia immorale: i dipen...
Come stanno andando Fastweb e Vodafone d...
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: 15:30.


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