SQL: Rozdíl mezi INNER JOIN a LEFT JOIN

SQL: Rozdíl mezi INNER JOIN a LEFT JOIN
« kdy: 19. 02. 2020, 18:13:35 »
Zdravím,
na jednom internetovém foru jsou fora uložená v tabulce forums. Jednotlivé diskuse (témata) pod daným forumem jsou uložená v tabulce topics. Ještě je tam tabulka forum_perms, která udává jaké má uživatel privilégia, zda smí přispívat do diskuse, prohlížet forum apod. Taky je tam tabulka subscriptions, odkud se dá zjistit zda uživatel chce sledovat danou diskusi. Na stránce s diskusí se před zobrazením diskuse provádí tento SQL příkaz (pro přehlednost rozděleno na víc řádků):

SELECT t.uid, t.subject, t.desc_x, t.first_post_id, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, s.user_id AS is_subscribed
FROM topics AS t

INNER JOIN forums AS f
ON f.id=t.forum_id

LEFT JOIN forum_perms AS fp
ON (fp.forum_id=f.id AND fp.group_id=1)

LEFT JOIN subscriptions AS s
ON (t.id=s.topic_id AND s.user_id=2)

WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=17 AND t.moved_to IS NULL

Zajímá mě proč se jednou používá INNER JOIN a podruhé LEFT JOIN.


Re:SQL: Rozdíl mezi INNER JOIN a LEFT JOIN
« Odpověď #1 kdy: 19. 02. 2020, 18:45:33 »
INNER JOIN znamená, že se spojí ty záznamy, které existují v levé i pravé tabulce. LEFT (OUTER) JOIN znamená, že se vezmou záznamy z levé tabulky, a připojí se k nim záznamy z pravé tabulky, pokud existují. Pokud odpovídající záznam v pravé tabulce neexistuje, doplní se na jeho místo NULL hodnoty.

TJ. když budete mít tabulky table_A a table_B:
Kód: [Vybrat]
table_A
id | hodnota_A
1    A
2    B
3    C

table_B
id | hodnota_B
1    X
4    Y

Pokud uděláte table_A (INNER) JOIN table_B podle sloupců id, dostanete výsledek

Kód: [Vybrat]
id | hodnota_A | hodnota_B
1    A           X


Pokud uděláte table_A LEFT (OUTER) JOIN table_B podle sloupců id, dostanete výsledek

Kód: [Vybrat]
id | hodnota_A | hodnota_B
1    A           X
2    B           NULL
3    C           NULL

RIGHT JOIN by byl opačně, tj. všechny záznamy z pravé tabulky a k nim připojené existující záznamy z levé tabulky.

Re:SQL: Rozdíl mezi INNER JOIN a LEFT JOIN
« Odpověď #2 kdy: 19. 02. 2020, 19:35:59 »
A co když chci přidat záznamy z tabulky users, ale ne všechny. Protože users jsou mimojiné i nastavení z profilu uživatele aj. a mě zajímá např. jen emailová adresa uživatele (email), skupina (group) ve které je zařazen, datum registrace (registered), avar (číslo obrázku).

SELECT t.uid, t.subject, t.desc_x, t.article, t.hide_smilies, t.first_post_id, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, s.user_id AS is_subscribed
FROM topics AS t

INNER JOIN forums AS f
ON f.id=t.forum_id

INNER JOIN users AS u ON u.id=t.uid

LEFT JOIN forum_perms AS fp
ON (fp.forum_id=f.id AND fp.group_id=1)

LEFT JOIN subscriptions AS s
ON (t.id=s.topic_id AND s.user_id=2)

WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=17 AND t.moved_to IS NULL

Re:SQL: Rozdíl mezi INNER JOIN a LEFT JOIN
« Odpověď #3 kdy: 19. 02. 2020, 19:47:24 »
V relačních databázích se jako „záznam“ označuje řádek tabulky. E-mailová adresa, skupin, datum registrace a další budou spíš sloupce. Které sloupce budou ve výsledku dotazu je uvedeno za klíčovým slovem SELECT. Když chcete ve výsledku sloupec email z tabulky users, kterou máte v dotazu pojmenovanou u, přidáte do SELECTu u.email. A tak dále.

Re:SQL: Rozdíl mezi INNER JOIN a LEFT JOIN
« Odpověď #4 kdy: 19. 02. 2020, 20:07:30 »
To je pravda, já už myslel, že bych to měl uvést za INNER JOIN users AS u ... to byl hloupý dotaz. Taky obvykle používám slovo záznam pro řádek.