boro112 ned 5.8.2018 18:05

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

boro112 pon 6.8.2018 11:25

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

Bobobo-bo Bo-bobo pon 6.8.2018 13:24

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

gumifufna čet 20.9.2018 10:33
Friday kaže...

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.

Friday čet 20.9.2018 19:50
gumifufna kaže...
Friday kaže...

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

Bobobo-bo Bo-bobo čet 20.9.2018 23:45

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.

Friday pet 21.9.2018 07:05
Bobobo-bo Bo-bobo kaže...

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?

Friday pet 21.9.2018 21:32
Bobobo-bo Bo-bobo kaže...

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

Bobobo-bo Bo-bobo uto 25.9.2018 23:38

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.

Friday sri 26.9.2018 07:56
Bobobo-bo Bo-bobo kaže...
 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.

 

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?