SQL Join

poruka: 13
|
čitano: 1.394
|
moderatori: Danny_HR, Lazarus Long, XXX-Man
1
+/- sve poruke
ravni prikaz
starije poruke gore
9 godina
offline
SQL Join

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

 
0 0 hvala 0
9 godina
offline
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

 
0 0 hvala 0
6 godina
offline
Re: SQL Join

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

9 godina
offline
SQL Join

Da, ne da uvijek točno. 

 
0 0 hvala 0
10 godina
offline
SQL Join

Koja je poanta grupiranja ako nema agregacije?

Freak Show Inc.
Moj PC  
0 0 hvala 0
4 godine
offline
Re: SQL Join
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.

10 godina
offline
Re: SQL Join
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

Freak Show Inc.
6 godina
offline
Re: SQL Join

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.

10 godina
offline
Re: SQL Join
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?

Freak Show Inc.
6 godina
offline
Re: SQL Join

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

10 godina
offline
Re: SQL Join
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

Freak Show Inc.
6 godina
offline
Re: SQL Join

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.

10 godina
offline
Re: SQL Join
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?

Freak Show Inc.
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice