eine etwas andere mysql abfrage - help ;-/

splat

Erfahrenes Mitglied
Hi,

Ich würde gerne eine Preisliste bestimmter Kategorien erstellen lassen. Ich habe schon einige Zeit gegoogelt, aber so langsam weiss ich gar nicht mehr nach was ich noch suchen könnte
Hier mal eine kleine Einleitung in die Datenbank (MySQL):

Es gibt 3 Tabellen:
Eine Tabelle mit den Kateogien (categories) und eine mit den Produkten (products). Mit Hilfe der dritten Tabelle (products_categories), kann ich ganz einfach die Zuordnungen von Produkten<->Kategorien festlegen. In der Tabelle categories kann man über die Spalte "parent_id" auch Unterkategorien erstellen. parent_id = id der übergeordneten Kategorie.

So, jetzt der ganze Ablauf.. (vielleicht liege ich ja auch völlig verkehrt und man könnte das viel einfacher lösen). In der Preisliste.php lese ich sämtliche Hauptkategorien aus (Die Kategorien an oberster Stelle) und lasse mir alle auflisten.
Jetzt kann ich alle Kategorien über Checkboxen markieren die ich später in meiner Preisliste haben möchte.
Die gesetzten Kategorien schicke ich über ein Formular ab und möchte jetzt in einem PHP File die gesetzten Kategorien checken lassen.

Nach langem hin und her habe ich das jetzt über diese Schleife realisiert:

PHP:
for ($i = 0; $i < count($_POST['kategorie']); $i++) dosomething();

Mit echo $_POST['kategorie'][$i] bekomme ich die values aller von mir markierten Kategorien ausgegeben. Soweit so gut.. jetzt könnte ich so alle Artikel aus der DB holen und in eine Liste ausgeben lassen:

PHP:
db_query("
SELECT p.id, p.name 
FROM products p, products_categories pc, categories c 
WHERE p.id = pc.product_id AND pc.category_id = ".$_POST['kategorie'][$i]);

Manche der Kategorien haben aber keine Artikel sondern Unterkategorien mit Artikeln. Wie kann ich mir jetzt die id's der Unterkategorien bzw alle Artikel darin auch mit ausgeben lassen? Hat da jemand eine Idee? Ich bin mittlerweile schon fast am verzweifeln, zumal möchte ich am Schluss noch eine Sortierung der Artikel haben. Wie ich das lösen kann weiss ich auch noch nicht. :(
Hat hier vielleicht jemand eine Idee Jeder Tip ist willkommen :)

Greetz, Marc
 
Ich verstehe die folgende Zeile in deiner DB Abfrage nicht. Sind das alles tabellen oder wie? Wenn ja, musst du auch alle mit Komma trennen. Order versuchst du da etwa bestimmte Felder in Tabellen anzusprechen?
Oder versuchst du zb mit "products p" ein Alias zu erstellen?

PHP:
FROM products p, products_categories pc, categories c
 
ganz genau. Wenn ich später noch die Abfrage erweitere, dann habe ich die id der Produkte und der Kategorien, mit p. und .c kann ich die unterscheiden.
 
ja...so geht das aber nicht. Eine korrekte MySQL Abfrage wäre zB so:

PHP:
$query = mysql_query("SELECT products.id, products.name
FROM products, products_categories, categories
WHERE products.id = products_categories.product_id AND products_categories.category_id = ".$_POST['kategorie'][$i]);
 
versuchs doch mal damit:
PHP:
    $sql = 'SELECT p.id, p.name '
          .'FROM products p LEFT JOIN products_categories pc ON (p.id = pc.product_id)'
          .'WHERE '; 
    for ($i = 0; $i < count($_POST['kategorie']); $i++) {
        $sql .= 'pc.category_id = '.$_POST['kategorie'][$i];
        if ($i < count($_POST['kategorie'])-1) { $sql .= ' OR '; }
    }
    $sql .= ' ORDER BY p.name';

    db_query($sql);
 
oder das ganze schon mit preis kategorie id und kategorie name
PHP:
$sql = 'SELECT pc.product_id, p.name as p_name, p.preis, pc.category_id, c.name as c_name '
      .'FROM products p '
         .'RIGHT JOIN products_categories pc ON (p.id=pc.product_id) '
         .'LEFT JOIN category c ON (c.id=pc.category_id) '
      .'WHERE '; 
for ($i = 0; $i < count($_POST['kategorie']); $i++) {
    $sql .= 'pc.category_id = '.$_POST['kategorie'][$i];
    if ($i < count($_POST['kategorie'])-1) { $sql .= ' OR '; }
}
$sql .= ' ORDER BY p.name';
für die etwas anderen MySQL Abfragen kann ich dir die Seite empfehlen.
 
@ kniedel: mit products p, ... klappt alles wunderbar, welche php version hast du denn?

@ BobDerMeister: Danke für diese Abfrage.. allerdings bekomme ich bei der ersten auch nur die Artikel der Kategorien die Artikel enthalten. Bei denen, die Unterkategorien enthalten bekomme ich nichts..

Hier ist meine Abfrage und Ausgabe..

abfrage.php
PHP:
function generiere_preisliste($frm) {
	$sql = 'SELECT pc.product_id, p.name as p_name, p.price, pc.category_id, c.name as c_name '
	.'FROM products p '
	.'RIGHT JOIN products_categories pc ON (p.id=pc.product_id) '
	.'LEFT JOIN categories c ON (c.id=pc.category_id) '
	.'WHERE ';
	for ($i = 0; $i < count($_POST['kategorie']); $i++) {
		$sql .= 'pc.category_id = '.$_POST['kategorie'][$i];
		if ($i < count($_POST['kategorie'])-1) { $sql .= ' OR '; }
	}
	$sql .= ' ORDER BY p.name'; 
	$qid = db_query($sql); 
	
	include("templates/ausdruck.php");
}

ausdruck.php:
PHP:
<? while ($r = db_fetch_object($qid)) { ?>
<tr>
	<td class="listtext"><? pv($r->id) ?></td>
	<td class="listtext"><? pv($r->name) ?></td>
</tr>
<? } ?>

vielleicht siehst du ja noch etwas..

- Marc
 
wenn du nur eine unter Kategorie hast sollte das in etwa so gehen
PHP:
for ($i = 0; $i < count($_POST['kategorie']); $i++) {
    $sql .= 'pc.category_id = '.$_POST['kategorie'][$i].' OR c.parent_id='.$_POST['kategorie'][$i].' ';
    if ($i < count($_POST['kategorie'])-1) { $sql .= ' OR '; }
}

bin mir aber nicht ganz sich ob das funktioniert, wenn nicht musst du halt erst alle Kategorien und Unterkategorien auslesen und die dann in den query einbauen.
 
mmh eine Kategorie habe ich noch mit 2 Unterkategorien, also 2 Kategorien weiter nach unten... das wird wohl nicht klappen.
Naja, ich versuch jetzt erstmal das Script im ganzen zu verstehn, vielleicht komm ich ja jetzt auch selbst drauf :)

- Marc
 
Zurück