Nette\Database: table alias
- Skippous
- Člen | 21
Ahoj potřeboval bych nějak vynutit join přes table alias a získat toto SQL:
SELECT products.*
FROM `products`
LEFT JOIN `params` p1 ON `products`.`id` = `p1`.`products_id`
LEFT JOIN `params` p2 ON `products`.`id` = `p2`.`products_id`
WHERE (`p1`.`param_types_id` = 47 AND `p1`.`value` IN ('110'))
AND (`p2`.`param_types_id` = 49 AND `p2`.`value` IN ('1,3'))
Místo:
SELECT products.*
FROM `products`
LEFT JOIN `params` ON `products`.`id` = `params`.`products_id`
WHERE (`params`.`param_types_id` = 47 AND `params`.`value` IN ('110'))
AND (`params`.`param_types_id` = 49 AND `params`.`value` IN ('1,3'))
Netuším jak na to a lze to vůbec nette database umožňuje. Díky za rady, dotaz skládám takto:
$data = $this->db->table('products');
foreach ($this->filter as $typeId => $values) {
$data->where("params:param_types_id = ? AND params:value IN (?)", $typeId, $values);
}
- Skippous
- Člen | 21
@redhead: Rozdělením příjdu o součin v závorce.
WHERE (`params`.`param_types_id` = 47 AND `params`.`value` IN ('110'))
Navíc potřebuji pro každý parametr vynutit join, jinak je výsledek pouze jako kdyby byla podmínka na parametr jedena..
@ViPEr*CZ*: Pardon, verze je 2.0.3. a potřebuji tam mít AND.
@hrach: Ok. Díky za info, myslel jsem si to.
- qwerin
- Člen | 25
ps. ono je celkem logicke ze by tohle melo vygenerovat dva joiny:
$conn->table("dr_produkt")->where(" :ns_filtr_item_produkt.id_filtr_item=406")->where(":ns_filtr_item_produkt.id_filtr_item=408 ");
protoze v AND je blbost se ptat na jeden sloupec dvemi hodnotami coz nette DB vygeneruje:
SELECT `dr_produkt
.*
FROM dr_produkt
LEFT JOIN ns_filtr_item_produkt
ON
dr_produkt
.id_produkt
=
ns_filtr_item_produkt
.id_produkt
WHERE (ns_filtr_item_produkt
.id_filtr_item
=406)
AND
(ns_filtr_item_produkt
.id_filtr_item
=408)`
- qwerin
- Člen | 25
Takže neco takoveho? .. a jak je to vykonove oprimalni oproti join?
<?php $conn->table(„dr_produkt“)->where(" :ns_filtr_item_produkt.id_filtr_item=406")->where(„dr_produkt.id_produkt“,$conn->table(„ns_filtr_item_produkt“)->select(„id_produkt“)->where(„id_filtr_item=408“)); ?>
SELECT dr_produkt
.id_produkt
FROM dr_produkt
LEFT JOIN ns_filtr_item_produkt
ON
dr_produkt
.id_produkt
=
ns_filtr_item_produkt
.id_produkt
WHERE (ns_filtr_item_produkt
.id_filtr_item
=406) AND
(dr_produkt
.id_produkt
IN ((1710),
(1760), (1761), (2080)))
- qwerin
- Člen | 25
tak jo nasel jsem dva BUGy
1.
$conn->table("dr_produkt")
->where("dr_produkt.id_produkt ?",$this->context->mysql->conn->table("ns_filtr_item_produkt")->select("id_produkt")->where("id_filtr_item=406"))
->where(array("dr_produkt.id_produkt"=>$this->context->mysql->conn->table("ns_filtr_item_produkt")->select("id_produkt")->where("id_filtr_item=408")));
vygeneruje
SELECT `id_produkt`
FROM `ns_filtr_item_produkt`
WHERE (`id_filtr_item`=406)
SELECT `id_produkt`
FROM `ns_filtr_item_produkt`
WHERE (`id_filtr_item`=408)
SELECT `id_produkt`
FROM `dr_produkt`
WHERE (`dr_produkt`.`id_produkt` IN ((1710), (1711), (1759), (1761), (2080), (2102))) AND
(`dr_produkt`.`id_produkt` IN ((1710), (1760), (1761), (2080)))
a toto:
$conn->table("dr_produkt")
->where("dr_produkt.id_produkt ?",$this->context->mysql->conn->table("ns_filtr_item_produkt")->select("id_produkt")->where("id_filtr_item=406"))
->where("dr_produkt.id_produkt ?",$this->context->mysql->conn->table("ns_filtr_item_produkt")->select("id_produkt")->where("id_filtr_item=408"));
generuje pouze toto:
SELECT `id_produkt`
FROM `ns_filtr_item_produkt`
WHERE (`id_filtr_item`=406)
SELECT `id_produkt`
FROM `dr_produkt`
WHERE (`dr_produkt`.`id_produkt` IN ((1710), (1711), (1759), (1761), (2080), (2102)))
2. bug pouziti exist.. ale to asi jen neumim pouzit
$conn->table("dr_produkt")
->where("EXISTS (SELECT id_produkt FROM ns_filtr_item_produkt WHERE dr_produkt.id_produkt=ns_filtr_item_produkt.id_produkt AND ns_filtr_item_produkt.id_filtr_item=406)");
->where("EXISTS (SELECT id_produkt FROM ns_filtr_item_produkt WHERE dr_produkt.id_produkt=ns_filtr_item_produkt.id_produkt AND ns_filtr_item_produkt.id_filtr_item=408)");
tady join parser zacne parsovat dr_produkt.id_produkt=ns_filtr_item_produkt.id_produkt a skonci chybou
Editoval qwerin (28. 1. 2014 10:04)