Jak na SQL dotaz z podmínkiu EXISTS
- OdpadlikCZ
- Člen | 15
Můžete mi, prosím, někdo poradit jak tento SQL dotaz přepsat do Database/Explorer.
SELECT si.*
FROM stock_items si
WHERE si.cat_id = 30
AND si.active = 1
AND EXISTS (
SELECT 1
FROM stock_items_types sit
WHERE si.id = sit.id_i
AND (sit.pocet > 0 OR sit.active = 1)
);
Pokud použiji
$q = $this->database
->table($this->db_items)
->alias($this->db_items,'si')
->where('EXISTS (SELECT 1 FROM stock_items_types sit WHERE si.id = sit.id_i AND (sit.pocet > 0 OR sit.active = 1) )');
tak mi to vyhodí chybu
Nette\InvalidArgumentException
No reference found for $stock_items->sit.
V tabulce ‚stock_items_types‘ exstuje cizí klíč
Zdroj | Cíl |Při smazání | Při změně
id_i | stock_items(id) | RESTRICT | RESTRICT
Předem moc děkuji za rady.
Editoval OdpadlikCZ (9. 12. 10:04)
- Kamil Valenta
- Člen | 820
Ona opravdu ze stock_items neexistuje reference do stock_items_types.
Pro vazbu „has many“ bys musel použít „->related“:
https://doc.nette.org/…ase/explorer#…
Možná by ale vyšlo efektivněji (než EXISTS a subdotaz) udělat běžný
LEFT JOIN ze stock_items_types do stock_items a pak GROUP BY si.id
Pro Explorer to bude přímočará konstrukce a výsledný dotaz (tipuji) bude
rychlejší.
- OdpadlikCZ
- Člen | 15
Nejsem si jistý, jestli to bude fungovat i v případě, že primárně vybírám items z ‚stock_items‘ z dané categorie ‚cat_id‘ a přes ‚stock_items_types‘ jsem chtěl vybrat jen ty items co mají aspoň jeden nenulový typ v tbl ‚stock_items_types‘ podle sloupce ‚pocet‘.
Jestli jsem tě pochopil správně, tak bych to měl zkusit jít přes tabulku ‚stock_items_types‘,ale tam není vazba na kategorii.
- OdpadlikCZ
- Člen | 15
ještě by to šlo přes SQL dotaz
SELECT * FROM stock_items si
RIGHT JOIN stock_items_types sit ON si.id = sit.id_i
WHERE si.cat_id = 30
AND si.active = 1
AND sit.pocet > 0
AND sit.active = 1;
ale nedaří semo převést do Database/Explorer
- Kamil Valenta
- Člen | 820
$q = $this->database
->table('stock_items_types')
->select('stock_items.id')
->where('stock_items_types.pocet > 0 OR stock_items_types.active = 1')
->where('stock_items.active = 1')
->where('stock_items.cat_id', 30)
->group('stock_items.id');