MySQL RIGHT JOIN Tutorial

MySQL RIGHT JOIN koristimo kada nam treba izvestaj iz baze kojim izvlacimo podatke iz vise tabela tako da za sve redove u desnoj tabeli trazimo odgovarajuce redove u levoj tabeli.

Naravno, moze se desiti da naidjemo na nepopunjene redove u levoj tabeli, bez obzira sto imamo podatke u desnoj.

Struktura MySQL RIGHT JOIN komande se, sem upotrebe kljucne reci RIGHT JOIN, ne razlikuje se od LEFT ili INNER (obicnog) JOIN-a:

SELECT prodavnice.gradovi, prodavnice.prodavnice, poslato.dokument 
FROM prodavnice
RIGHT JOIN poslato
ON prodavnice.p_id=poslato.p_id
ORDER BY prodavnice.gradovi;

Da se prisetimo sadrzaja obe tabele:

mysql> SELECT * FROM prodavnice;
+------+-----------+------------+-----------+-------------+------+
| p_id | gradovi   | prodavnice | proizvod  | raspolozivo | cena |
+------+-----------+------------+-----------+-------------+------+
|    1 | Beograd   | prbg1      | Kafa      |         121 |  150 |
|    2 | Beograd   | prbg2      | Cigare    |          50 |  300 |
|    3 | Subotica  | prsub1     | Hleb      |          43 |   45 |
|    4 | Nis       | prnis1     | Hleb      |          23 |   55 |
|    5 | Kraljevo  | prkrl1     | Pavlaka   |         155 |   50 |
|    6 | Uzice     | pruzi1     | Mleko     |          68 |   90 |
|    7 | Majdanpek | prmaj1     | Mleko     |          91 |   87 |
|    8 | Bor       | prbor1     | Pavlaka   |         155 |   50 |
|    9 | Kikinda   | prkik1     | Ajzaklija |          38 |  650 |
|   10 | Obrenovac | prob1      | Jabuke    |          35 |  120 |
|   11 | Smederevo | prsm1      | Ajvar     |          28 |  270 |
|   12 | Zrenjanin | przr1      | Somun     |          10 |   59 |
|   13 | Jagodina  | prjg1      | Bakalar   |          29 |  400 |
+------+-----------+------------+-----------+-------------+------+
13 rows in set (0.03 sec)

mysql>

Sadrzaj tabele "poslato":

mysql> SELECT * FROM poslato;
+------+----------+------+
| s_id | dokument | p_id |
+------+----------+------+
|    1 |    55210 |    1 |
|    2 |    32618 |    1 |
|    3 |    50687 |    9 |
|    4 |    49321 |    4 |
|    5 |    39658 |    3 |
|    6 |    41200 |   11 |
+------+----------+------+
6 rows in set (0.00 sec)

mysql>

Pre nego pokrenemo MySQL RIGHT JOIN, potrebno je da unesemo jos neke podatke u tabelu "poslato". Radi se o nekim dokumentima kojima smo dodelili sifre (25527 i 42931), ali ih nismo jos nikom poslali:

mysql> INSERT INTO poslato (s_id, dokument, p_id)
    -> VALUES (NULL, 25527, NULL);
Query OK, 1 row affected (0.25 sec)

mysql> INSERT INTO poslato (s_id, dokument, p_id)
    -> VALUES (NULL, 42931, NULL);
Query OK, 1 row affected (0.05 sec)

mysql>

Stanje tabele "poslato" nakon unosa novih dokumenata:

mysql> SELECT * FROM poslato;
+------+----------+------+
| s_id | dokument | p_id |
+------+----------+------+
|    1 |    55210 |    1 |
|    2 |    32618 |    1 |
|    3 |    50687 |    9 |
|    4 |    49321 |    4 |
|    5 |    39658 |    3 |
|    6 |    41200 |   11 |
|    7 |    25527 | NULL |
|    8 |    42931 | NULL |
+------+----------+------+
8 rows in set (0.02 sec)

mysql>

Idemo konacno pokrenuti RIGHT JOIN:

mysql> SELECT prodavnice.gradovi, prodavnice.prodavnice, poslato.dokument
    -> FROM prodavnice
    -> RIGHT JOIN poslato
    -> ON prodavnice.p_id=poslato.p_id
    -> ORDER BY prodavnice.gradovi;
+-----------+------------+----------+
| gradovi   | prodavnice | dokument |
+-----------+------------+----------+
| NULL      | NULL       |    42931 |
| NULL      | NULL       |    25527 |
| Beograd   | prbg1      |    55210 |
| Beograd   | prbg1      |    32618 |
| Kikinda   | prkik1     |    50687 |
| Nis       | prnis1     |    49321 |
| Smederevo | prsm1      |    41200 |
| Subotica  | prsub1     |    39658 |
+-----------+------------+----------+
8 rows in set (0.00 sec)

mysql>

Dakle, imamo sve dokumente u izvestaju, cak i one koji nisu nikom dodeljeni.