PDA

View Full Version : [PHP-SQL] Impossibile... ma mi succede...


Teju
25-09-2007, 16:55
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:

Torav
25-09-2007, 18:29
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

Teju
26-09-2007, 10:02
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

Teju
26-09-2007, 17:12
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!?

Torav
26-09-2007, 18:52
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...

Teju
27-09-2007, 18:22
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:

Alien
01-10-2007, 13:00
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.

Teju
01-10-2007, 14:25
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:

Teju
01-10-2007, 14:29
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

Alien
01-10-2007, 14:50
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.

Alien
01-10-2007, 19:19
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.

Teju
01-10-2007, 20:09
(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...

Alien
01-10-2007, 20:27
:) 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 ;)

Teju
01-10-2007, 21:02
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

Bl4xoR
02-10-2007, 19:31
formula le query in modo corretto verbalmente, senza metterci robe di codice etc. :) si capirebbe di più ;)