Autor Zpráva
Mysqlnovacek
Profil *
Ahoj,

byl bych moc rád, kdybyste mne navedli nebo pomohli se složením mysql dotazu, jelikož se teprve učím a rád bych viděl, jak se daná situace řeší.

Ukážu to na příkladu:

Mám tabulku PRODUCT a tabulku CATEGORY. Každý produkt je zařazen v nějaké kategorii struktura vypadá následovně:
PRODUCT:
id | name | slug| category_id
a nejaka data v teto tabulce:
1 | Kolotoč | kolotoc | 1
2 | Koloběžka | kolobezka | 2

CATEGORY:
id | name | slug
a nejaka data v teto tabulce:
1 | Atrakce | atrakce
2 | Zábava | zabava


Problém je následující. Mám stránku, kde znám jen CATEGORY.slug a na základě toho potřebuji vybrat veškeré produkty, které se v této kategorii nalézají. Řešení, které jsem napsal asi není to pravé ořechové předpokládám:
<?php
// osetreni dotazu zatim neresme
$slug = $_GET['slug'];

$categories = mysql_query('SELECT id FROM category WHERE slug = "'.$slug.'"');
while ($category= mysql_fetch_object($categories)) {
	$products = mysql_query('SELECT * FROM products WHERE category_id = '.$category->id.'');
}
while ($product = mysql_fetch_object($product)) {
	echo $product->name;
}
?>


Lze to zapsat nějak rozuměji než takto nehezkým "vnořeným" mysql dotazem ve while?


Děkuji za každou radu.
o_O
Profil
Mysqlnovacek:
if(!isset($_GET['slug']))
  die("Chyba");
$products=mysql_query("SELECT p.* FROM products p LEFT JOIN category c ON (c.id=p.category_id) WHERE c.slug='".mysql_real_escape_string($_GET['slug'])."'");
Vybere všechny informace z tabulky products kde Kategorie.slug se rovná $_GET['slug'].
mysql_real_escape_string -> Ošetření proti SQL injection.

Mimochodem ve Vašem případě si proměnnou $products neustále přepisujete. Šlo by to udělat i jednodušeji:
// osetreni dotazu zatim neresme 
$slug = $_GET['slug']; 
$id_kategorii=array();
$categories = mysql_query('SELECT id FROM category WHERE slug = "'.$slug.'"'); 
while ($category= mysql_fetch_object($categories)) { 
    $id_kategorii[]=$category->id; 
}
$product=mysql_query('SELECT * FROM products WHERE category_id IN ('.implode(",",$id_kategorii).')'); 
while ($product = mysql_fetch_object($product)) { 
    echo $product->name; 
}
Mysqlnovacek
Profil *
Ahoj,

děkuji Vám za příklad s left join, funguje to hezky, už tomu rozumím.

Jinak ve zmíněném příkladě si $products nepřepisuji, jelikož slug je v databázi jedinečný a tak je cyklus proveden vždy jen jednou. To, že by byly v databázi uložené 2 totožné hodnoty ve sloupci slug se nikdy nestane.

Děkuji tedy ještě jednou za příklad a ochotu.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0