NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Více JOINů na jedno id

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Ondřej Pech
Člen
Avatar
Ondřej Pech:28.12.2016 13:01

Ahoj, potřeboval bych poradit mám toho SQL:

SELECT *
                                        FROM scripts
                                        INNER JOIN user ON userId = creatorId
                                        ORDER BY createDate DESC

V tabulce Users mám informace o uživatelích a v tabulce scripts různé záznamy a u nic ID uživatele, který záznam vytvořil a ID uživatele, který záznam naposledy upravil.

name ... ... creatorId corectorId
Bla bla ... ... 1 3

Současné SQL vy z tabulky users na JOINuje jméno uživatele místo jeho creatorId, to samé bych ale potřeboval udělat zároveň i pro corectorId abych mohl pak vypsat jména místo IDček.
Potřeboval bych nakopnout, jak to bude vypadat, díky.

 
Odpovědět
28.12.2016 13:01
Avatar
Ondřej Pech
Člen
Avatar
Ondřej Pech:28.12.2016 13:25

Zkusil jsem něco takového ale zjevně je to úplně mimo:

SELECT *
FROM scripts
INNER JOIN user AS creator ON user.userId = scripts.creatorId
RIGHT JOIN user AS corrector ON user.userId = scripts.correctorId
/*correctorId může být NULL v případě že script ještě nikdo neupravil*/
ORDER BY createDate DESC
 
Nahoru Odpovědět
28.12.2016 13:25
Avatar
d4rkw34v3r
Tvůrce
Avatar
Odpovídá na Ondřej Pech
d4rkw34v3r:28.12.2016 13:39

Zkus použít aliasy u spojovaných tabulek. Něco takového by mohlo fungovat.

SELECT *
FROM scripts
INNER JOIN user u1 ON u1.userId = scripts.creatorId
LEFT JOIN user u2 ON u2.userId = scripts.correctorId
ORDER BY createDate DESC
Editováno 28.12.2016 13:40
 
Nahoru Odpovědět
28.12.2016 13:39
Avatar
Ondřej Pech
Člen
Avatar
Ondřej Pech:28.12.2016 13:55

Hm, pořád mám něco špatně. Zkusím přiložit víc konkrétního kódu.

...
$result = Db::queryAll('
                                        SELECT *
                                        FROM scripts
                                        INNER JOIN user u1 AS creator ON u1.userId = scripts.creatorId
                                        LEFT JOIN user u2 AS corrector ON u2.userId = scripts.correctorId
                                        ORDER BY createDate DESC
                                ');
                                foreach ($result as $u)
                                {
                                        echo htmlspecialchars($u['creator']);
                                        echo htmlspecialchars($u['corrector'])
                                }

Přikládám i ukázky tabulek:
### User

userId userName userPass email
1 Ondřej Pech 1e8cc05087932­a9770de4199476e13bf ondrej.pech@domena.cz
2 Tomáš Fuk 1e8cc05087932­a9770de4199576e13bf tomas.fuk&domena.cz
3 Tomáš Jedno 1e8cc05087932­a9770de4199576e13bf tomas.jedno@domena.cz

### Scripts

name label text creatorId correctorId scriptId ...
Název 1 popis obsah 1 2 1 ...
Název 2 popis obsah 2 2 2 ...
Název 3 popis obsah 3 NULL 4 ...
 
Nahoru Odpovědět
28.12.2016 13:55
Avatar
d4rkw34v3r
Tvůrce
Avatar
Odpovídá na Ondřej Pech
d4rkw34v3r:28.12.2016 14:04
...
$result = Db::queryAll('
                                        SELECT *
                                        FROM scripts
                                        INNER JOIN user u1 ON u1.userId = scripts.creatorId
                                        LEFT JOIN user u2 ON u2.userId = scripts.correctorId
                                        ORDER BY createDate DESC
                                ');
                                foreach ($result as $u)
                                {
                                        echo htmlspecialchars($u['creator']);
                                        echo htmlspecialchars($u['corrector'])
                                }

za aliasem tabulky si měl další alias. (INNER JOIN user u1 AS creator)

 
Nahoru Odpovědět
28.12.2016 14:04
Avatar
Ondřej Pech
Člen
Avatar
Ondřej Pech:28.12.2016 14:13

Jo, tohle SQL už mi projde, jen asi jsem debil ale jak teď vypíšu v tom cyklu jména těch lidí $u['.....'] v jaké proměnné mám uloženo jméno toho, kdo vytvořil dokument?

 
Nahoru Odpovědět
28.12.2016 14:13
Avatar
d4rkw34v3r
Tvůrce
Avatar
Odpovídá na Ondřej Pech
d4rkw34v3r:28.12.2016 14:35

dumpni si proměnnou $result a uvidíš, co ti to všechno vrací.

Lepší by taky bylo, kdyby si místo " SELECT * " rovnou vypsal sloupce, které budeš chtít přímo získat z databáze.

např.

SELECT s.scriptId, s.label, s.text, s.name, u1.userName AS creator, u2.userName AS corector
FROM scripts s
INNER JOIN user u1 ON u1.userId = scripts.creatorId
LEFT JOIN user u2 ON u2.userId = scripts.correctorId
ORDER BY createDate DESC
Editováno 28.12.2016 14:36
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
28.12.2016 14:35
Avatar
Ondřej Pech
Člen
Avatar
Ondřej Pech:28.12.2016 15:16

Vyspsal jsem si SQLkem přímo v databázi, co to udělá za výslednou tabulku opravdu tam mám správně oba sloupce se jménem ale oba mají stejný název "userName" šlo by v tom SQL ty sloupce uložit pod svým vlastním názvem například creatorName a correctorName?

 
Nahoru Odpovědět
28.12.2016 15:16
Avatar
d4rkw34v3r
Tvůrce
Avatar
Odpovídá na Ondřej Pech
d4rkw34v3r:28.12.2016 15:36

v SELECTu si vypiš sloupce tak, jak jsem ti to popsal v mém předposledním příspěvku. Tím aliasem nastavíš sloupci název

 
Nahoru Odpovědět
28.12.2016 15:36
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.