Suchscript findet etwas zuviel

Suchscript findet etwas zuviel

am 24.04.2005 14:39:15 von Stephan Lucht

Ich hab da ein kleinen Denkfehler glaub ich.

Ich habe zwei tabellen products und products_description in der ersten gibt
es ein Statusfeld und in der zweiten die Beschreibung nun soll die Abfrage
die raussuchen auf die das Suchwort passt aber nur dann wenn in der erten
der Status 1 ist meine derzeitige Abfrage:

$anfrage65 =mysql_query("select * from products_description,products where
products_description.products_name like '%$value%' or
products_description.products_description like '%$value%' or
products_description.products_longdescription like '%$value%' &&
products.products_status='1'");


bringt falsche ergebnisse.

Hat jemand eine idee was ich falsch mache??

Mfg
Stephan

Re: Suchscript findet etwas zuviel

am 24.04.2005 14:57:55 von Marianne Heibold

ich weiss zwar nicht was rauskommen soll, aber versuch mal die Abfrage zu
klammern.

$anfrage65 =mysql_query("select * from products_description,products where
( products_description.products_name like '%$value%' or
products_description.products_description like '%$value%' or
products_description.products_longdescription like '%$value%') &&
products.products_status='1'");

Re: Suchscript findet etwas zuviel

am 24.04.2005 14:58:59 von Hartmut Holzgraefe

Stephan Lucht wrote:
> Ich hab da ein kleinen Denkfehler glaub ich.

genau ;)

> Ich habe zwei tabellen products und products_description in der ersten =
gibt=20
> es ein Statusfeld und in der zweiten die Beschreibung nun soll die Abfr=
age=20
> die raussuchen auf die das Suchwort passt aber nur dann wenn in der ert=
en=20
> der Status 1 ist meine derzeitige Abfrage:

[abfrage umformatiert:]

select *
from products_description,products
where products_description.products_name like '%$value%'
or products_description.products_description like '%$value%'
or products_description.products_longdescription like '%$value%'
&& products.products_status=3D'1'

Vorab: "SELECT * FROM ..." ist, na sagen wir einfach mal, suboptimal.
Normalerweise weißt du genau welche Ergebnisspalten du benötigst und
fragst auch genau die ab statt einfach zu sagen "Gib mir alles!"

"or" und "&&" zu mischen ist auch nicht unbedingt clever, besser fährst=

du damit grundsätzlich "and" und "or" statt "&&" und "||" zu benutzen,
damit funktionieren deine Abfragen auch auf anderen SQL-Dialekten.

Das Hauptproblem ist aber hier einfach die Operator-Rangfolge, ein
"and" bindet stärker als ein "or". Damit liest der Parser deine
Abfrage als:

select *
from products_description,products
where products_description.products_name like '%$value%'
or products_description.products_description like '%$value%'
or (
products_description.products_longdescription like '%$value%'
&& products.products_status=3D'1'
)

Was du aber möchtest ist:

select *
from products_description,products
where ( products_description.products_name like '%$value%'
or products_description.products_description like '%$value%'
or products_description.products_longdescription like '%$value%=
'
)
AND products.products_status=3D'1'






--=20
Hartmut Holzgraefe, Senior Support Engineer .
MySQL AB, www.mysql.com

Don't miss the MySQL Users Conference 2005: http://www.mysqluc.com