[ vladimirn @ 13.04.2007. 10:35 ] @
U bazi imam tri tabele

gradovi
polja: id, naziv

regioni
polja: id, naziv


tip_smestaja
polja: id, naziv


potrebno mi je da izvucem sve id i sve nazive u jednom upitu. Probao sam sa left join, right join, i inner join

Code:

SELECT t.id as smestajid, t.naziv as smestajnaziv, g.id as gradid, g.naziv as gradnaziv FROM tip_smestaja t left join gradovi g on t.id = g.id group by t.id


Ovo je primer sa dve tabele i dobijem rezultat ali u tom rezultatu dobijam samo onoliko redova koliko ima u jednoj tabeli, pa ako u tabeli tip_smestaja imam 8 recorda a u tabeli gradovi imam 7 recorda, dobijem 8 rezultata, stim da mi je zadnji record iz tabele gradovi NULL. ukoliko u tabeli gradovi imam 9 recorda, prikaze mi se samo 8 rezultata, a trebalo bi mi svih 9.

Sa tri tabele nisam dobio nista. u trecoj tabeli (regioni) uneo sam samo 2 rekorda, i onda kada sam to nekako pokusao da join ili da union ili bilo sta, dobio bih rezultate koji s eponavljaju onoliko puta koliko ima rekorda. Ne znam sta da radim.
Molim za pomoc, pa ako nisam dobro objasnio pokusacu ponovo da objasnim.
[ chachka @ 13.04.2007. 12:20 ] @
Znaci ako imamo tabele
Code:

CREATE TABLE gradovi (
  id CHAR(5) NOT NULL PRIMARY KEY,
  naziv VARCHAR(30) NOT NULL);

CREATE TABLE regioni (
  id CHAR(5) NOT NULL PRIMARY KEY,
  naziv VARCHAR(30) NOT NULL);

CREATE TABLE tip_smestaja (
  id CHAR(5) NOT NULL PRIMARY KEY,
  naziv VARCHAR(30) NOT NULL);

onda je resenje:
Code:

SELECT MAX(CASE WHEN z.tip = 'G'
                THEN z.naziv
                ELSE NULL
            END) AS grad,
       MAX(CASE WHEN z.tip = 'R'
                THEN z.naziv
                ELSE NULL
            END) AS regioni,
       MAX(CASE WHEN z.tip = 'S'
                THEN z.naziv
                ELSE NULL
            END) AS tip_smestaja
  FROM (SELECT 'G' AS tip, g1.id AS id, g1.naziv AS naziv, COUNT(g2.id) AS rbr
          FROM gradovi AS g1
               INNER JOIN
               gradovi AS g2
                 ON g1.id >= g2.id
         GROUP BY g1.id, g1.naziv
         UNION ALL
        SELECT 'R' AS tip, r1.id AS id, r1.naziv AS naziv, COUNT(r2.id) AS rbr
          FROM regioni AS r1
               INNER JOIN
               regioni AS r2
                 ON r1.id >= r2.id
         GROUP BY r1.id, r1.naziv
         UNION ALL
        SELECT 'S' AS tip, s1.id AS id, s1.naziv AS naziv, COUNT(s2.id) AS rbr
          FROM tip_smestaja AS s1
               INNER JOIN
               tip_smestaja AS s2
                 ON s1.id >= s2.id
         GROUP BY s1.id, s1.naziv
       ) AS z
 GROUP BY z.id, z.rbr
 ORDER BY z.rbr
[ vladimirn @ 13.04.2007. 12:35 ] @
hvala do neba! dobio sam rezultat u mysql sada da to prenesem u array u php i onda mogu da nastavim. puno ti hvala ;))
[ vladimirn @ 13.04.2007. 12:40 ] @
ah nije gotovo :(
da li mi mozes pomoci da izvucem i gradid, tipsmestajaid i regionid?
[ chachka @ 13.04.2007. 12:58 ] @
Znam :) , ali to bi barem sada trebalo da bude lako. Pokusaj.

Napomena: Ako je id integer i ako ne postoje rupe u id-jevima, onda se upit moze uraditi bez kolone 'rbr' (nemoraju se INNER JOIN-ovati tabele same sa sobom), gde ce ulogu kolone 'rbr' zameniti kolona 'id'.
[ chachka @ 14.04.2007. 21:00 ] @
Proslo je vise od jednog dana, pa evo i kompletnog resenja:
Code:

SELECT MAX(CASE WHEN z.tip = 'G'
                THEN z.id
                ELSE NULL
            END) AS sifra_grada,
       MAX(CASE WHEN z.tip = 'G'
                THEN z.naziv
                ELSE NULL
            END) AS ime_grada,
       MAX(CASE WHEN z.tip = 'R'
                THEN z.id
                ELSE NULL
            END) AS sifra_regiona,
       MAX(CASE WHEN z.tip = 'R'
                THEN z.naziv
                ELSE NULL
            END) AS ime_regiona,
       MAX(CASE WHEN z.tip = 'S'
                THEN z.id
                ELSE NULL
            END) AS tip_smestaja,
       MAX(CASE WHEN z.tip = 'S'
                THEN z.naziv
                ELSE NULL
            END) AS ime_smestaja
  FROM (SELECT 'G' AS tip, g1.id AS id, g1.naziv AS naziv, COUNT(g2.id) AS rbr
          FROM gradovi AS g1
               INNER JOIN
               gradovi AS g2
                 ON g1.id >= g2.id
         GROUP BY g1.id, g1.naziv
         UNION ALL
        SELECT 'R' AS tip, r1.id AS id, r1.naziv AS naziv, COUNT(r2.id) AS rbr
          FROM regioni AS r1
               INNER JOIN
               regioni AS r2
                 ON r1.id >= r2.id
         GROUP BY r1.id, r1.naziv
         UNION ALL
        SELECT 'S' AS tip, s1.id AS id, s1.naziv AS naziv, COUNT(s2.id) AS rbr
          FROM tip_smestaja AS s1
               INNER JOIN
               tip_smestaja AS s2
                 ON s1.id >= s2.id
         GROUP BY s1.id, s1.naziv
       ) AS z
 GROUP BY z.id, z.rbr
 ORDER BY z.rbr

Ako hocete nesto da naucite iz gornjeg upita pokrenite zasebno podupit:
Code:

SELECT 'G' AS tip, g1.id AS id, g1.naziv AS naziv, COUNT(g2.id) AS rbr
  FROM gradovi AS g1
       INNER JOIN
       gradovi AS g2
         ON g1.id >= g2.id
 GROUP BY g1.id, g1.naziv
 UNION ALL
SELECT 'R' AS tip, r1.id AS id, r1.naziv AS naziv, COUNT(r2.id) AS rbr
  FROM regioni AS r1
       INNER JOIN
       regioni AS r2
         ON r1.id >= r2.id
 GROUP BY r1.id, r1.naziv
 UNION ALL
SELECT 'S' AS tip, s1.id AS id, s1.naziv AS naziv, COUNT(s2.id) AS rbr
  FROM tip_smestaja AS s1
       INNER JOIN
       tip_smestaja AS s2
         ON s1.id >= s2.id
  GROUP BY s1.id, s1.naziv

Kao rezultat smo dobili skup svih gradova, regiona i tipova smestaja. Ovaj skup pored osnovnih informacija sadrzi i informaciju o poreklu (G, R ili S) kao i redni broj numerisan po poreklu.

Spoljni upit grupise ovu pomocnu tabelu i razdvaja njene kolone na vise kolona (CASE deo) u zavisnosti od porekla.

MAX jednostavno uklanja pocetne NULL-ove svake kolone.


[Ovu poruku je menjao chachka dana 15.04.2007. u 10:58 GMT+1]
[ vladimirn @ 18.04.2007. 10:24 ] @
Izvinjavam se zbog kasnog odgovora, ali zelim da ti zahvalim, naucio sam ponsto rekao bih i razjasnio sebi neke stvari. Hvala ti na pomoci, pozdrav :)