View Full Version : [PHP-SQL] Impossibile... ma mi succede...
Ciao gente, ho una query che, tramite un po' di giri incasinati, arriva a formarsi così:
SELECT DISTINCT organization.id, organization.name, organization.acronym
FROM contact.org_item, contact.organization
WHERE (
organization.name LIKE '%%'
OR organization.acronym LIKE '%%'
OR organization.website LIKE '%%'
OR organization.comment LIKE '%%'
OR organization.remarks LIKE '%%'
OR organization.assessment LIKE '%%'
)
AND (
(
(
org_item.item_id = '843'
AND org_item.org_id = organization.id
)
OR (
org_item.item_id = '847'
AND org_item.org_id = organization.id
)
)
AND (
(
org_item.item_id = '513'
AND org_item.org_id = organization.id
)
)
)
ORDER BY organization.name, organization.acronym
LIMIT 0 , 30
Eseguendola non mi trova alcun risultato (anche se ne dovrebbe trovare...)
Ho pensato ad un errore nel formularla, allora ho provato a sostituire dei pezzi con un "1" e così me la risolve sempre:
SELECT DISTINCT organization.id, organization.name, organization.acronym
FROM contact.org_item, contact.organization
WHERE (
organization.name LIKE '%%'
OR organization.acronym LIKE '%%'
OR organization.website LIKE '%%'
OR organization.comment LIKE '%%'
OR organization.remarks LIKE '%%'
OR organization.assessment LIKE '%%'
)
AND (
(
(
1
)
)
AND (
(
org_item.item_id = '513'
AND org_item.org_id = organization.id
)
)
)
ORDER BY organization.name, organization.acronym
LIMIT 0 , 30
e
SELECT DISTINCT organization.id, organization.name, organization.acronym
FROM contact.org_item, contact.organization
WHERE (
organization.name LIKE '%%'
OR organization.acronym LIKE '%%'
OR organization.website LIKE '%%'
OR organization.comment LIKE '%%'
OR organization.remarks LIKE '%%'
OR organization.assessment LIKE '%%'
)
AND (
(
(
org_item.item_id = '843'
AND org_item.org_id = organization.id
)
OR (
org_item.item_id = '847'
AND org_item.org_id = organization.id
)
)
AND (
(
1
)
)
)
ORDER BY organization.name, organization.acronym
LIMIT 0 , 30
...non capisco dunque come la prima query non dia risultati se entrambe queste trovano una soluzione... :muro:
beh non sono un grande esperto di sql e magari sto per dire una fregnaccia, ma non è detto che le condizioni a cui tu hai sostituito uno siano entrambe vere SIMULTANEAMENTE, il che (se non sbaglio) invece richiede la tua query
Boh, secondo me se le due query "modificate" funzionano entrambe dando risultati, anche la prima intera dovrebbe dare risultati... corretti o no ma qualche risultato dovrebbe darmelo... no?? :D
amedeoviscido
26-09-2007, 16:10
Sostituisci il primo AND con una OR.
In pratica, se parte a destra dell'AND è falsa, lo è anche la parte a sinistra. Con OR non è vero. Ti ricordo le tabelle di verità:
A AND B
-------
A B AND
F F F
F V F
V F F
V V V
A OR B
------
A B OR
F F F
F V V
V F V
V V V
Sostituisci il primo AND con una OR.
In pratica, se parte a destra dell'AND è falsa, lo è anche la parte a sinistra.
Non credo di dover far ciò... nel senso, nella query che ho riportato ho la prima parte con i LIKE "%%", ovvero prendere tutto, ma di solito verrebbe una cosa tipo LIKE "%nome%", dunque lì dovrebbe rimanere l'AND, perchè appunto voglio che non mi compaiano risultati se una delle due cose non è rispettata...
amedeoviscido
26-09-2007, 17:27
Scusami ma allora non riesco a capire a cosa serva la prima parte!?
Boh, secondo me se le due query "modificate" funzionano entrambe dando risultati, anche la prima intera dovrebbe dare risultati... corretti o no ma qualche risultato dovrebbe darmelo... no?? :D
beh se l'intersezione dei due insieme che le query "modificate" ti danno è vuoto allora con l'AND non trovi nulla...
Scusami ma allora non riesco a capire a cosa serva la prima parte!?
Beh, la prima parte mi pare ovvio cosa serve, cercare all'interno delle organizzazioni con una parola chiave.
L'esempio scritto da me ha il LIKE "%%" ovvero cerca tutto, ma la query generata non è sempre uguale, può anche avere le condizioni LIKE "%srl%" e cerca solo tra le org che sono srl...
beh se l'intersezione dei due insieme che le query "modificate" ti danno è vuoto allora con l'AND non trovi nulla...
Ma, se io sostituisco con l'1 (ovvero con un TRUE) prima questa parte:
(
org_item.item_id = '843'
AND org_item.org_id = organization.id
)
OR (
org_item.item_id = '847'
AND org_item.org_id = organization.id
)
e poi questa:
(
org_item.item_id = '513'
AND org_item.org_id = organization.id
)
ed entrambi trova risultati, vuol dire che entrambe le condizioni generano un TRUE, altrimenti se una fosse FALSE quando è scritta intera e non sostituita con l'1 non dovrebbe dare cmq risultati...
:mbe: :help: :help:
per forza che non funziona
Quale riga può avere due valori differenti di organization.id?
tu scrivi:
(
org_item.item_id = '843'
AND org_item.org_id = organization.id
)
OR (
org_item.item_id = '847'
AND org_item.org_id = organization.id
)
AND
(
org_item.item_id = '513'
AND org_item.org_id = organization.id
)
e quando mai può esser realizzata?
Comunque la clausola di join org_item.org_id = organization.id è inutile scriverla tre volte è sufficiente una sola e risulta anche più chiaro il codice di conseguenza.
No... non mi pare proprio...
Quella clausola di JOIN è corretta secondo me!
In pratica io seleziono tutte gli "organization.id" della tabella "organization", ma scelgo solo quelli che, collegandomi alla tabella org_item (composta da 2 campi: org_id e item_id), risultano avere l'idem_id pari al valore scelto.
Tutti gli "organization.id" hanno lo stesso valore all'interno della query...
:muro: :muro:
Comunque la clausola di join è inutile scriverla tre volte è sufficiente una sola e risulta anche più chiaro il codice di conseguenza.
Su questo ti do ragione, ma essendo una query generata dinamicamente preferivo per "chiarezza" segnalarla ogni volta... :p
No... non mi pare proprio...
Quella clausola di JOIN è corretta secondo me!
:muro: :muro:
scusa
avevo letto di fretta e ho fatto confusione tra i diversi ID
Appena ho un attimo ci rifletto meglio.
Ho ri-flettuto nuovamente e son ri-tornato alla mia precedente conclusione: è impossibile che sia verificato quell'AND tra 2 valori diversi dell'ID.
Tu vorresti ottener una riga dove org_item.item_id abbia due valori diversi il che non è possibile.
Cioè:
(org_item.item_id = '843' OR org_item.item_id = '847') AND org_item.item_id = '513' non potrà mai esser verificato perchè o vale 843 oppure 847 OPPURE (e non "e anche") 513. Il problema è tutto lì.
Come se pretendessi di ottenere il nome del presentatore di Miss Italia che fa di nome Mike e Loretta. Non ottieni due risultati ma nessuno.
(org_item.item_id = '843' OR org_item.item_id = '847') AND org_item.item_id = '513' non potrà mai esser verificato perchè o vale 843 oppure 847 OPPURE (e non "e anche") 513. Il problema è tutto lì.
:) uhm... ti seguo credo, forse ho capito... ma come si fa allora a fare una query così??
Suggerimenti?
...EDIT: ok, ho capito l'errore, ora xò non saprei come creare la query...
:) uhm... ti seguo credo, forse ho capito... ma come si fa allora a fare una query così??
Suggerimenti?
...EDIT: ok, ho capito l'errore, ora xò non saprei come creare la query...
Dipende dal risultato che vuoi ottenere :D
Così di primo acchito direi mettendo in OR anche la condizione
(
(
org_item.item_id = '513'
AND org_item.org_id = organization.id
)
)
però se posti la struttura delle tabelle con qualche dato e il risultato che vuoi ottenere provo a perderci un po' di tempo, tanto son a casa ammalato ;)
Ok, provo a spiegarti... ho 3 tabelle:
organization (interessa solo che abbia un ID identificativo)
item (hanno ID identificativo, un ID_categoria e un label)
org_item (hanno ID identificativo, org_id e item_id)
ho una pagina di search in cui posso cercare una organizzazione secondo una parola chiave o secondo dei criteri di ricerca sugli ITEM.
Gli ITEM sono suddivisi in categorie.
Criteri di ricerca sugli ITEM:
- i vari ITEM della stessa categoria sono in OR
- tra le diverse categorie dev'esserci un AND
Mi spiego con un esempio di dati: nella tabella ITEM ho:
1 . 1 . Italy
2 . 1 . France
3 . 2 . Socialmente utili
4 . 1 . Spain
Ho una organizzazione:
232 . nome e caratteristiche varie...
In org_item ho:
1 . 232 . 1
2 . 232 . 2
3 . 232 . 3
Ovvero l'organizzazione con ID 232 è classificata sotto Italy, France e Socialmente utili.
La mia query potrebbe chiedermi di selezionare le organizzazioni che hanno in "categoria = 1" Italy o France (dunque in OR) AND siano socialmente utili.
Spero si capisca... :p
formula le query in modo corretto verbalmente, senza metterci robe di codice etc. :) si capirebbe di più ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.