
SQL Join


Riješeno.
SELECT fixed_pages.orderby, fixed_pages.title_hr as title1_hr, fixed_pages.text_hr, fixed_pages.page_id, site_photos.table_id, site_photos.photo_name, site_photos.title_hr,
COALESCE(MIN(site_photos.id), 0) AS id
FROM fixed_pages
LEFT JOIN site_photos ON site_photos.title_hr = fixed_pages.id
GROUP BY fixed_pages.id, site_photos.title_hr order by fixed_pages.id DESC

Na kojoj bazi to radi?
Na svim bazama osim MySQL-a rješenje javlja grešku - polja u SELECT-u s grupiranjem moraju biti ili navedena u GROUP BY clause ili u agregatnoj funkciji (SUM, COUNT i sl.)
Na MySQL-u upit ne puca, ali može dati pogrešan rezultat (SQLFiddle).
Ako su tablice zadane kao:
CREATE TABLE fixed_pages(id int, orderby int, title_hr varchar(4), text_hr varchar(4), page_id varchar(6));
INSERT INTO fixed_pages(id, orderby, title_hr, text_hr, page_id)
VALUES(3, 4, 'dzgh', 'DHGH', 'fiksna');
CREATE TABLE site_photos(id int, table_id varchar(6), title_hr int, photo_name varchar(10));
INSERT INTO site_photos(id, table_id, title_hr, photo_name)
VALUES(1077, 'fiksna', 3, '1077.jpg'),
(1076, 'fiksna', 3, '1076.jpg');
Tvo upit:
SELECT fixed_pages.orderby, fixed_pages.title_hr as title1_hr, fixed_pages.text_hr, fixed_pages.page_id, site_photos.table_id, site_photos.photo_name, site_photos.title_hr,
COALESCE(MIN(site_photos.id), 0) AS id
FROM fixed_pages
LEFT JOIN site_photos ON site_photos.title_hr = fixed_pages.id
GROUP BY fixed_pages.id, site_photos.title_hr order by fixed_pages.id DESC
daje rezultat:
| orderby | title1_hr | text_hr | page_id | table_id | photo_name | title_hr | id |
|---------|-----------|---------|---------|----------|------------|----------|------|
| 4 | dzgh | DHGH | fiksna | fiksna | 1077.jpg | 3 | 1076 |
Rezultar je pogrešan - id je 1076, ali je photo_name 1077.jpg

Da, ne da uvijek točno.

Koja je poanta grupiranja ako nema agregacije?

Koja je poanta grupiranja ako nema agregacije?
Nikakava.
GROUP BY je direktno vezan za agregatne funkcije.
Svi atributi iz SELECT liste (a izvan funkcija za agregaciju), se trebaju navesti u GROUP BY listi - što mu je jedina i funkcija.
Uz agregatne funkcije se može eventualno staviti HAVING klauzula, koja koristi rezultat pomenute agregatne funkcije a po redoslijedu mora ići iza GROUP BY.
Inače agregatne funkcije su: AVG, SUM, COUNT, MIN i MAX.

Koja je poanta grupiranja ako nema agregacije?
Nikakava.
GROUP BY je direktno vezan za agregatne funkcije.
Svi atributi iz SELECT liste (a izvan funkcija za agregaciju), se trebaju navesti u GROUP BY listi - što mu je jedina i funkcija.
Uz agregatne funkcije se može eventualno staviti HAVING klauzula, koja koristi rezultat pomenute agregatne funkcije a po redoslijedu mora ići iza GROUP BY.
Inače agregatne funkcije su: AVG, SUM, COUNT, MIN i MAX.
Znam, zivim od toga

U MySQLu se očito ne drže SQL-92 kao pijan plota.
Novijem MySQLu se može uključiti SQL mode koji grupiranom upitu u SELECT-u dozvoljava ili agregatne funkcije, ili stupce iz GROUP BY (standardni SQL-92), ili stupce koji su funkcijski zavisni o stupcima iz GROUP BY ("T301 opcionalni feature" u SQL99)
select author.id, author.name, count(*)
from author
inner join book on author.id = book.author_id
group by author.id
Ovo ne puca jer je engine prepoznaje da author.name ima točno jednu vrijednost za svaki author.id.

U MySQLu se očito ne drže SQL-92 kao pijan plota.
Novijem MySQLu se može uključiti SQL mode koji grupiranom upitu u SELECT-u dozvoljava ili agregatne funkcije, ili stupce iz GROUP BY (standardni SQL-92), ili stupce koji su funkcijski zavisni o stupcima iz GROUP BY ("T301 opcionalni feature" u SQL99)
select author.id, author.name, count(*)
from author
inner join book on author.id = book.author_id
group by author.id
Ovo ne puca jer je engine prepoznaje da author.name ima točno jednu vrijednost za svaki author.id.
A koliko je "skupo" to prepoznavanje ako radis sa tablicom koja ima parsto milijuna redaka a nema UC na ta dva polja?

Prepoznaje se deklarativno - u gornjem primjeru author.id mora biti ključ (primary ili unique).

Prepoznaje se deklarativno - u gornjem primjeru author.id mora biti ključ (primary ili unique).
OK, ali po cemu sustav zna da je kombinacija id-name unique ako ne postoji UC?
I definitivno sam protiv ovakve prakse jer je izraz prakticki neispravan ali eto ipak radi

MySQL s uključenim SQL mode ONLY_FULL_GROUP_BY radi slično kao i ostali RDBMSovi. U ovom primjeru pogleda definiciju tablice author, pa ako stupac id nema UC sustav javlja grešku da name nije u GROUP-BY clause.
Razlika je samo ako stupac id jest deklariran kao unique. Ostale SQL baze me tjeraju da i author.name stavim u GROUP-BY, iako grupiranje po author.id automatski osigurava da svaki redak rezultata ima točno jednu vrijednost tog polja.
Prema ovom blogu MySQL sortira po svim grupiranim poljima pa će upit raditi brže ako je samo id u GROUP-BY.

Cekaj, znaci nemoguce je da 2 autora imaju isto ime ili sta?
Sta bi bilo da uneses u bazu 2 koja imaju isto ime i onda pokrenes upit?
Pozdrav,
Imam dvije tablice fixed_pages i site_photos iz kojih bi trebao izvući rezultate.
Dakle, iz prve tablice bi trebali biti svi rezultati gdje je page_id='fiksna', a veza je fixed_pages.id=site_photos.title_hr.
Upit funkcionira , dobro poveže i prikaže rezultate kako treba (dobijem photo_name stupac iz druge tablice), ali bi trebao ograničiti rezultate druge tablice na po jedan red i to sa najnižim ID.
Znači ako u prvoj tablici imam npr. naziv1, a u drugoj tablici imam dvije fotografije koje povezuje taj naziv1, trebao bi prikazati samo prvu fotografiju jer ima niži id. Ne znam kako bi to napravio, ne ispada mi nikako dobro.
ovo imam za sada li to je bez tog ograničenja.
SELECT fixed_pages.orderby, fixed_pages.title_hr as title1_hr, fixed_pages.text_hr, fixed_pages.page_id, site_photos.table_id, site_photos.photo_name, site_photos.title_hr
FROM fixed_pages
LEFT JOIN site_photos ON fixed_pages.id=site_photos.title_hr
where fixed_pages.page_id='fiksna' order by fixed_pages.orderby asc