Slef join databáze (alias)
- Oli
- Člen | 1215
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
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)
- Oli
- Člen | 1215
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
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á
- nemají žádnou odpověď
- 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? :-)