Vzájemné použití AND + OR v klauzuli WHERE

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
roman.campula
Člen | 60
+
0
-

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
CZechBoY
Člen | 3608
+
0
-

edit: blbost

Featuru na joinování podle libovolných (a ne jen pk+fk) sloupců by to chtělo no…

Můžeš si udělat takovej vlastní join přes php

$db->table('data')
  ->where('idA', $idA)
  ->where('idB', $idB)
  ->where('idC', $idC);

Editoval CZechBoY (23. 5. 2016 14:00)

roman.campula
Člen | 60
+
+1
-

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)
CZechBoY
Člen | 3608
+
0
-

Aha, no jasně no. Potom už chápu.

Můžeš použít subselect?
Musíš použít Nette\Database\Table nebo ti stačí ResultSet?

roman.campula
Člen | 60
+
0
-

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)