Slef join databáze (alias)

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

Ahoj,
mám tabulku, která má cizí klíč sama na sebe. Jde potom na ni zavolat related? Potřeboval bych zjistit jestli se nachází uživatel 123 v rodicovskem nebo detskem radku a vypsat ten rodicovsky. Mam to zhruba takhle:

$context->table('article')->where('child_id IS NULL')->where('user_id = ? || :article.user_id = ?', $userId, $userId);

To ale samozřejmě hází

SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias:

Je to možné?

petr.pavel
Člen | 535
+
0
-

Moc tomu dotazu nerozumím, ale to asi ani není potřeba.

Dotazy na sama sebe nelze přes NDB/NotORM řešit jinak než přes view.

Editoval petr.pavel (21. 5. 2014 19:24)

enumag
Člen | 2118
+
0
-

Bohužel Nette\Database to neumí. Přesněji řečeno neuměla když jsem ji ještě používal, byl to jeden z důvodů proč jsem ji opustil. Možná se od té doby něco změnilo.

Editoval enumag (22. 5. 2014 0:02)

hrach
Člen | 1838
+
0
-

jaky dotaz to generuje?

Oli
Člen | 1215
+
0
-
SELECT `article`.*
FROM `article`
LEFT JOIN `article` ON `article`.`id` = `article`.`reply_id`
WHERE (`child_id` IS NULL) AND (`user_id` = 2 || `article`.`user_id` = 2)

I když popravdě, teď, když na to koukám, tak tam mám vlastně 2 self joiny (reply_id a child_id). Takže bych potřeboval i určit, přes kterej to spojit :-) Ale i tak by to bylo skvělý, kdyby to zvládlo aspoň jeden ;-)

Oli
Člen | 1215
+
0
-

Tak jsem to nějak poskládal aby to zatím aspoň fungovalo, ale vůbec se mě to nelíbí. :-/ Potřeboval bych poradit, jak bych to mohl přepsat efektivnějc. Abych to trochu nastínil tak mám strukturu tabulky zhruba

název sloupce popisek
id PK
user_id FK
thread_id FK, který ukazuje na id téže tabulky
reply_id FK, který ukazuje na id téže tabulky

S tím, že vlákno je dáno primárním klíčem, který má sloupec thread_id NULL. A já bych potřeboval vypsat všechny vlákna, která

  1. nemají žádnou odpověď
  2. jsem do nich napsal alespoň jeden příspěvek

Nic lepšího než následující jsem v podstatě nevymyslel. Respektive i vymyslel, ale nevím jak bych to mohl napsat pomocí NDBT

public function getActiveThread()
{
	return $this->_db->table($this->table)->where('thread_id IS NULL');
}

public function getPostsByUserId($userId)
{
	$result = [];
	foreach ($this->_db->table($this->table)->where('user_id', $userId) as $value)
	{
		if (is_null($value->thread))
		{
			$result[] = $value->id;
		} else
		{
			$result[] = $value->thread->id;
		}
	}
	return $this->getActiveThread()->where('id IN', $result);
}

public function getEmptyThreads()
{
	$threads = $this->getActiveThread();
	$result = [];
	foreach ($threads as $value)
	{
		if (!count($this->_db->table($this->table)->where('thread_id', $value->id)))
		{
			$result[] = $value->id;
		}
	}
	return $this->_db->table($this->table)->where('id IN', $result);
}

Jde tahle hrůza přepsat nějak rozumnějc? :-)

Maekoboss
Člen | 36
+
+1
-

Ahoj,

jak to je Nette DB pořád neumí použít cizí klíč na stejnou tabulku?