Vzájemné použití AND + OR v klauzuli WHERE
- roman.campula
- Člen | 60
Zdravím,
mám dotaz ohledně výběru z databáze.
tabulka data obsahuje:
id|idA|idB|idC|data
1|10|1|1|data01
1|10|1|2|data02
1|10|1|3|data03
1|10|2|1|data04
1|10|2|2|data05
1|10|2|3|data06
1|11|1|1|data07
1|11|1|2|data08
1|11|1|3|data09
1|11|2|1|data10
1|11|2|2|data11
1|11|2|3|data12
tabulka assignment obsahuje:
id|user|idA|idB|idC
1|100|10|1|1
2|100|10|1|3
3|101|11|1|1
4|101|11|1|2
5|101|11|1|3
Jak mám pomocí Nette\Database udělat dotaz, který mi vrátí všechna
data, na která má oprávnění uživatel 100? Tedy výstup bude:
data01
data03
Uložím si požadované přístupy k datům:
$assign = $this->database->table("assignment")
->where("user", 100)
->fetchPairs("id")
Tím mám pole s hodnotami, které chci použít v části WHERE u tabulky data. Ale jak na to? Jak vyhledávat pomocí více sloupců současně, když mám tyto vyhledávací hodnoty v poli, které vrátilo fetchPairs()?
array (2)
1 => Nette\Database\Table\ActiveRow #c2ef
table private => Nette\Database\Table\Selection #60ec
data private => array (4)
id => 1
idA => 10
idB => 1
idC => 1
dataRefreshed private => FALSE
2 => Nette\Database\Table\ActiveRow #d74b
table private => Nette\Database\Table\Selection #60ec
data private => array (4)
id => 2
idA => 10
idB => 1
idC => 3
dataRefreshed private => FALSE
- roman.campula
- Člen | 60
No jo, jenomže toto mi udělá dotaz ve tvaru
...WHERE (idA IN (1, 2, 3)) AND (idB IN (10, 20, 30)) AND (idC IN (100, 200, 300))
ale já potřebuji něco ve smyslu
... WHERE (idA = 1 AND idB = 10 AND idC = 100) OR
(idA = 2 AND idB = 20 AND idC = 200) OR
(idA = 3 AND idB = 30 AND idC = 300)
- roman.campula
- Člen | 60
Subselect použít mohu, tomu by asi nic nemělo bránit. A stačí podle mě ResultSet, každopádně to musí být něco, co dokáže zpracovat třída Mesour\DataGrid\NetteDbDataSource od grid.mesour.com.
Editoval roman.campula (6. 6. 2016 14:04)