Aus einer SQL Tabelle mehrere verschiedene Werte einer Spalte auslesen

supercat1510

Erfahrenes Mitglied
Es geht um einen Online-Shop
Und ich versuche nun mehrere Kategorien aus der Datenbank auszulesen und auf einer Seite anzuzeigen.

Es gibt eine Tabelle für Produkte, eine für Kategorien und eine die beide miteinander verbindet.

Jetzt versuch ich z.B. alle Produkte anzuzeigen die in der Kategorie 14, 16, 17, 18, 19, 130 und 137 sind.

Nur leider legt mir meine Datenbankabfrage regelmäßig den Server kurzzeitig lahm - ich hab wohl einen rießigen Denkfehler dabei und brauche deswegen Hilfe.

PHP:
select * from products p, products_description pd, products_to_categories p2c 
			where p.products_id = pd.products_id 
			and pd.products_name != "" 
			and p.products_price != 0 
			and p2c.products_id = p.products_id 
			 and p2c.categories_id = 14
			or p2c.categories_id = 16
			or p2c.categories_id = 17
			or p2c.categories_id = 19
			or p2c.categories_id = 130
			or p2c.categories_id = 137
 
Es geht also um eine nxtCommerce basierende Datenbank.

bis hierher funktioniert das query auch bei mir sehr schnell
PHP:
select * from products p, products_description pd, products_to_categories p2c 
            where p.products_id = pd.products_id 
            and pd.products_name != "" 
            and p.products_price != 0 
            and p2c.products_id = p.products_id


Nun kommen aber die "Or's" welche alles andere ignorieren.

PHP:
            or p2c.categories_id = 16
            or p2c.categories_id = 17
            or p2c.categories_id = 19
            or p2c.categories_id = 130
            or p2c.categories_id = 137

Wenn du OR verwendest, werden alle vorhergehenden ANDS ignoriert.. ->

PHP:
AND
(
            p2c.categories_id = 14 
            OR p2c.categories_id = 16
            OR p2c.categories_id = 17
            OR p2c.categories_id = 19
            OR p2c.categories_id = 130
            OR p2c.categories_id = 137
)

Dies sollte besser funktionieren.

Kompletter Query neu:
PHP:
select * from products p, products_description pd, products_to_categories p2c 
            where p.products_id = pd.products_id 
            and pd.products_name != "" 
            and p.products_price != 0 
            and p2c.products_id = p.products_id
AND
(
            p2c.categories_id = 14 
            OR p2c.categories_id = 16
            OR p2c.categories_id = 17
            OR p2c.categories_id = 19
            OR p2c.categories_id = 130
            OR p2c.categories_id = 137
)
 
Danke - es funktioniert perfekt.

Diese Konstruktion einer Datenbankabfrage kannt ich bisher noch nicht - wieder was gelernt :)
 
Das Konstrukt ansich war schon OK.

Nur musst du dir die Problematik mit AND und OR veranschaulichen. Das mit den Klammern ist ein schönes Feature für eine klarere Struktur :-)
 
So neu ist es bestimmt nicht ^^
Das hat mit der Präzedenz zu tun, die jede Sprache hat und sogar viele gleich in den primitiven Operatoren.

mySQL zum Beispiel: http://books.google.de/books?id=pCH...q=präzedenz mysql&pg=PA71#v=onepage&q&f=false

PHP als weiteres Beispiel: http://books.google.de/books?id=Z8H...&dq=präzedenz php&pg=PA92#v=onepage&q&f=false

Nenn es für das bessere Verständnis "Punkt-vor-Strich-Rechnung für mySQL" mit dem Unterschied, dass es um ganze Ausdrücke geht und nicht nur um das Rechnen ;)
 
Zurück