Spojení se stejnou tabulkou

Odo
Člen | 48
+
0
-

Ahoj všem,

nedaří se mi vyřešit join se stejnou tabulkou – nevím, jak správně použít alias a/nebo joinWhere:

...->table('member_licence')
->select('*')
->alias('member_licence', 'l')
->joinWhere('l', 'l.member_id=member_licence.member_id AND l.category=?', 'ii')
->select('l.certificate');
// generuje LEFT JOIN `l` ON . = `l`. AND (`l`.`member_id`=`member_licence`.`member_id` AND `l`.`category`=?)

Očekávaný výsledek:

SELECT *,l.certificate
FROM member_licence
LEFT JOIN member_licence l
  ON l.member_id=member_licence.member_id AND l.category='ii'
WHERE member_licence.category IN ('ia','ib','ic')

Skutečný dotaz do databáze je mnohem složitější a kvůli takové prkotině se mi NDB nechce přepisovat do obyčejného query().

Předem díky za rady.

[Nette 2.4]

Editoval Odo (1. 5. 2020 18:22)

Odo
Člen | 48
+
0
-

Tak jsem na to přišel, já věděl, že to musí být jednoduché :)

Tabulka member_licence je provázaná s tabulkou member, takže zápisem .member:member_licence se dostanu zpět k tabulce member_licence podruhé, přičemž Nette mě upozorní, že musím pro duplicitní jméno tabulky nastavit alias.

Takže správně takto:

...
->alias('.member', 'm') // tenhle alias není nutný, ale používám ho ve zbytku dotazu
->alias('m:member_licence', 'l') // nastavím alias pro druhou tabulku
->joinWhere('l', 'l.category="ii"') // přidám podmínku ON
->select('l.certificate') // vyberu z druhé tabulky co chci
...

Akorát netuším, proč Nette ve výsledném SQL používá alias m_ref místo mého l :)

...
FROM `member_licence`
LEFT JOIN `member` `m` ON `member_licence`.`member_id` = `m`.`id`
LEFT JOIN `member_licence` `m_ref` ON `m`.`id` = `m_ref`.`member_id` AND (`m_ref`.`category`="ii")
...

Editoval Odo (1. 5. 2020 18:22)

Odo
Člen | 48
+
0
-

Ještě malý dotaz na autory NDB: joinWhere() se tváří, že v něm lze používat placeholdery (parametry), ale následující zápis vyhodí chybu:

->joinWhere('l', 'l.category=?', 'ii')

Editoval Odo (1. 5. 2020 18:46)

MikKuba
Člen | 76
+
0
-

Odo napsal(a):

Ještě malý dotaz na autory NDB: joinWhere() se tváří, že v něm lze používat placeholdery (parametry), ale následující zápis vyhodí chybu:

->joinWhere('l', 'l.category=?', 'ii')

Taky jsem nyní při používání joinWhere() narazil na to, že když jako třetí parametr zadám nějakou hodnotu pro dosazení, tak se úplně vyignoruje.

cc @DavidGrudl @hrach ?