SQL dotaz v Nette Database (vyber cenu díky 3 tabulkám)

rerege
Člen | 58
+
0
-

Prosím pomohl by mi někdo s mým prvním selektem.

Mám tabulku product_e_order kde je pole product_id (a číslo objednávky v e_order_id)
Mám tabulku product kde je pole price a pole product_id
Mám tabulku product_category kde je product_id a kategorie v poli category_id

Mám číslo objednávky a potřebuji vybrat cenu produktu, které má kategorii = 50 -
takový produkt by měl být vždy jen jeden

Prosím, jak to napsat co nejefektivněji pomocí Nette/Database? A jak postupujete, abyste se nezamotali do takového selektu …

Váňa

Editoval rerege (5. 6. 2017 11:47)

matopeto
Člen | 395
+
0
-

Skus si ako cvicenie napisat ten select v priamo v SQL. Pochopis strukturu a prepis do nette database bude jednoduchsi.

rerege
Člen | 58
+
0
-

Jj snaha byla… mám popsanou 1A4 – prostě amatér na slovo vzatý

Lze to udělat jedním selektem anebo se nevyhnu iteraci?

Phalanx
Člen | 310
+
+1
-

Nějak takhle?

<?php
$cena = $this->database->table('product_e_order')
    ->select('product.price')
    ->where('e_order_id=? AND product_category.category_id=?', $orderId, $categoryId)
    ->fetch();
?>

edit: Možná to bude chtít subselect, nejsem z tvého návrhu moc moudrý

<?php
$cena = $this->database->table('product_e_order')
    ->select('product.price')
    ->where('e_order_id=? AND product.id IN (SELECT product_id FROM product_category WHERE category_id=?)', $orderId, $categoryId)
    ->fetch();
?>

Editoval Phalanx (5. 6. 2017 12:33)

matopeto
Člen | 395
+
+2
-

rerege napsal(a):

Jj snaha byla… mám popsanou 1A4 – prostě amatér na slovo vzatý

Nie je nic zle na tom byt amaterom. Ale bez toho aby si to pochopil to nebude nikdy dobre fungovat a copypastovat cudzi kod bude znamenat dalsie chyby ktorym nebudes rozumniet. Tak google: sql tutorial, joins a pod :)

rerege
Člen | 58
+
0
-

@Matopeto – máš samozřejmě pravdu a věř mi, že v této vývojové fázi tak 80% čtu a googlím a zbytek kóduji – čímž mi to jde děsně pomalu… nejhorší je, když se to pak nechová, jak si člověk myslel …
ale tím si prostě musím projít

moc díky @Phalanx – o vnořeném selektu jsem již také četl :o)

hezký den všem a ještě jednou díky

Váňa

matopeto
Člen | 395
+
+1
-

SQL by bolo nejak takto:

Proste join cez vsetky tabulky a na konci where (poradie joinov a wherov je uz potom na optimalizaciu, ale toto je zaklad.)

SELECT `price` FROM `product_e_order` JOIN `product` JOIN `product_category` WHERE `e_order_id` = "order ID" AND `category_id` = 50;
rerege
Člen | 58
+
0
-

Tak ještě raz … mořím se nyní s chybou
No reference found for $product_e_order->product_category

Musím nastavit foreign key v tabulkách, nebo referenci mohu zadat při dotazu ->ref(… ?
Pokud ano, asi to nemohu dělat, když mám v tab. data, že?
Tabulky jsem promazal, klíč nastavil dle v tabulce product_e_order dle pole product_id a výsledek se brzy dostavil: problém s No reference found přetrvává..

Editoval rerege (5. 6. 2017 22:07)

matopeto
Člen | 395
+
0
-

Zalezi aku mas nastavenu convenciu v nettedatabase, jedna berie kluce, druha predpoklada nazvy tabuliek a klucov, viac v dokumentacii… skus to preverit.

rerege
Člen | 58
+
+1
-

@matopeto opravdu si cením, že jsi ochotný mi pomoci … od rána s tím zápasím a heureká právě slavím úspěch nakonec zabral ten vnořený selekt – byla tam malá chybka

velmi mi pomohl si MySQL Wokbench otevřít testovací okno a nejprve si to dát do pořádku v SQL(tak jak jsi to psal na začátku) a pak už to byla hračka…

Nicméně koukám kolik je toho ještě přede mnou … opravdu smekám, kdo si dokáže do hlavy naprat ty tuny informací… principy OOP, MVC, HTML, CSS, PHP, framework(a většina ne jeden), SQL, JavaScript
+ Composer, Git, IDE, SEO… a to jsem určitě na něco zapomněl

ještě jednou díky
Váňa

Editoval rerege (6. 6. 2017 13:26)

GEpic
Člen | 562
+
0
-

Nicméně koukám kolik je toho ještě přede mnou … opravdu smekám, kdo si dokáže do hlavy naprat ty tuny informací… principy OOP, MVC, HTML, CSS, PHP, framework(a většina ne jeden), SQL, JavaScript
+ Composer, Git, IDE, SEO… a to jsem určitě na něco zapomněl

To není za večer, ani za rok, ani za pět let. A není to o tom ty informace naprat do hlavy, ale hlavně pochopit problematiku a být schopný si případné informace dohledat. :)

Editoval GEpic (7. 6. 2017 1:20)