Autor Zpráva
oiuoiuo
Profil *
Zdravim, pokousim se o "uvodni stranu fora", ktera by mela vypadat nasledujicim zpusobem:

O WEBU
-pravidla 1 prispevek, autor admin, posledni prispevek 25.1.2010
-novinky 0 prispevku
POKEC
-o vsem ...
-o nicme ...

tabulky v db jsem zvolil 3
1. tabulka
kategorie (id, nazev)
1, o webu
2, pokec

2. tabulka
temata (id, nazev, id_kategorie)
1 pravidla 1
2 novinky 1
3 o vsem 2
4 o nicem 2

3. tabulka
prispevky
(id, id_tema, autor, datum...)
1 1 autor datum

a ted jak docilit myho pozadovanyho vysledku v jednom dotazu na db?

toho co chci docilit se da napr. takhle, ale takhle to mit nechci (nebo spis bych se to chtel naucit lip):
 $x = select nazev,id from kategorie  
  while ($x = $forum_kategorie) {
    echo $forum_kategorie[nazev]; //O WEBU
    $xx = select nazev,id from tema where id_kategorie = $forum_kategorie[id] 
    while ($xx = $forum_tema) {
      echo $forum_tema[nazev]; //PRAVIDLA, NOVINKY....
      echo $pocet = select count(id) from forum_prispevky where id_tema = $forum_tema[id] //1 prispevek
      echo $autor = select autor from prispevky where id_tema=$forum_tema[id] order by id desc //AUTOR ADMIN
    }    
  }


takze takhle bych toho docilil, ale je to zbytecne hodne dotazu tudit bych rad nejak vsechno nacpal do jednoho
pcmanik
Profil
Ten kod ti funguje? lebo o tom dost pochybujem...
oiuoiuo
Profil *
samozrejmne ze ne je to jen ukazka v rychlosti jak se to da vyresit, ale jak to nechci ;)
Kajman_
Profil *
nejak vsechno nacpal do jednoho
http://php.vrana.cz/srovnani-dotazu-do-zavislych-tabulek.php
oiuoiuo
Profil *
jak mi mel ten link pomoci?
Kajman_
Profil *
Je tam ukázka sql i php kódu pro řešení jedním dotazem. V sql je stěžení ten join, v php pamatování poslední kategorie.

Jako bonus navíc pojednáním o tom, že jeden dotaz nemusí být vždy lepší než dva nebo tři.

Inspiraci pro výsledný dotaz můžete hledat i v místních faq
http://diskuse.jakpsatweb.cz/?action=vthread&forum=28&topic=37836#pocet-komentaru
http://diskuse.jakpsatweb.cz/?action=vthread&forum=28&topic=37836#radky-s-maximem
oiuoiuo
Profil *
dneska jsem si s tim zase hral a proste jednim dotazem to nedokazu dokonce se mne nedari ani jednodussi dotaz tudiz napsal by jsi mi prosim jak by se dal aspon nejak zefektivnit tento kod:

 $x = select nazev,id from kategorie  
  while ($x = $forum_kategorie) {
    echo $forum_kategorie[nazev]; //O WEBU
    $xx = select nazev,id from tema where id_kategorie = $forum_kategorie[id] 
    while ($xx = $forum_tema) {
      echo $forum_tema[nazev]; //PRAVIDLA, NOVINKY....
      echo $pocet = select count(id) from forum_prispevky where id_tema = $forum_tema[id] //1 prispevek
      echo $autor = select autor from prispevky where id_tema=$forum_tema[id] order by id desc //AUTOR ADMIN
    }    
  }


pripadne jen tato cast:
    $xx = select nazev,id from tema 
    while ($xx = $forum_tema) {
      echo $forum_tema[nazev]; //PRAVIDLA, NOVINKY....
      echo $pocet = select count(id) from forum_prispevky where id_tema = $forum_tema[id] //1 prispevek
      echo $autor = select autor from prispevky where id_tema=$forum_tema[id] order by id desc //AUTOR ADMIN
    }    
  }
  
Kajman_
Profil *
Možná hledáte něco takového
select k.nazev kategorie,
       t.nazev tema,
       ifnull(p.pocet, 0) pocet,
       p.autor,
       p.datum
from   kategorie k
inner  join temata t
on     k.id = t.id_kategorie
left   outer join (select t3.id_tema, t1.autor, t1.datum, t3.pocet
                   from   prispevky t1
                   inner  join (select t2.id_tema,
                                       max(t2.id) id,
                                       count(*) pocet
                                from   prispevky t2
                                group  by t2.id_tema) t3
                   on     t1.id_tema = t3.id_tema
                          and t1.id = t3.id) p
on     t.id = p.id_tema
order  by 1, 2
oiuoiuo
Profil *
dekuji za odpoved, bohuzel mi to nefunguje, pokud to hodim primo v phpmyadmim jako sql dotaz tak to napise:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order by 1, 2
LIMIT 0, 30' at line 14


jinak jeste tady jsou tabulky:
CREATE TABLE IF NOT EXISTS `kategorie` (
  `id` int(11) NOT NULL auto_increment,
  `nazev` varchar(100) collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=4 ;

INSERT INTO `kategorie` (`id`, `nazev`) VALUES
(1, 'Kategorie 1'),
(2, 'Kategorie 2'),
(3, 'Kategorie 3');

CREATE TABLE IF NOT EXISTS `prispevky` (
  `id` int(11) NOT NULL auto_increment,
  `id_tema` int(11) NOT NULL,
  `nazev` varchar(100) collate utf8_unicode_ci NOT NULL,
  `autor` int(11) NOT NULL,
  `datum` int(10) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=6 ;


INSERT INTO `prispevky` (`id`, `id_tema`, `nazev`, `autor`, `datum`) VALUES
(1, 1, 'prispevek 1', 1, 0),
(2, 2, 'prispevek 2', 2, 0),
(4, 1, 'prispevek 3', 0, 0),
(5, 3, 'prispevek 4', 0, 0);


CREATE TABLE IF NOT EXISTS `tema` (
  `id` int(11) NOT NULL auto_increment,
  `id_kategorie` int(11) NOT NULL,
  `nazev` varchar(100) collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=32 ;


INSERT INTO `tema` (`id`, `id_kategorie`, `nazev`) VALUES
(1, 1, 'Pravidla'),
(2, 1, 'Novinky'),
(3, 2, 'O necem'),
(4, 2, 'O nicem');

Kajman_
Profil *
To byl jen nástin řešení. Ale když si sjednotíte název tabulky tema a temata, tak u mě i ten nástin funguje.

Pokud jste ještě při studiu nenarazil na spojování tabulek, bude pro vás takováto aplikace asi neřešitelným problémem. Raději si nejdříve přečtěte nějakou knížku nebo seriál na internetu.
oiuoiuo
Profil *
jaj to se omlouvam, ja totiz mam celkove jinak pojmenovany tabulky a radky tudiz jsem jeden prehlidl a samozrejme to funguje
nicmene mam jeste jeden dotaz dalo by se to "nejak" predelat aby vystup byl nasledujici:

kategorie1,nic,nic,nic
nic,tema1,autor...
nic,tema2,autor...
kategorie2,nic,nic...
oiuoiuo
Profil *
ahoj kajmane mam jeste jeden dotaz, kdyz pouziju ten tvuj dotaz tak je dobrej :), ale jeste jeste by me zajimala jedna vec:
konkretne tato cast:
  inner  join (select t2.id_tema,
                                       max(t2.id) id,
                                       count(*) pocet
                                from   prispevky t2
                                group  by t2.id_tema) t3


potreboval bych ziskat dve hodnoty :) (puvodne jsem chtel jednu ale uz chci dve)
konkretne:
  inner  join (select t2.id_tema,
                                       max(t2.id) id,
                                       count(*) pocet
                                from   prispevky t2
                                WHERE id_prispevek=0
                                group  by t2.id_tema) t3

a druhy:
  inner  join (select t2.id_tema,
                                       max(t2.id) id,
                                       count(*) pocet
                                from   prispevky t2
                                WHERE id_prispevek!=0
                                group  by t2.id_tema) t3


moje pokusy o pridani neklapnuli

tzn. ziskat dve cisla :)
diky moc za pomoc
oiuoiuo
Profil *
respektive kdyz to udelam:

                     INNER  JOIN (select t2.id_tema,
                                         max(t2.id) id,
                                         count(*) pocet
                                  FROM   forum_prispevek t2
                                  WHERE  t2.id_prispevek=0
                                  GROUP  BY id_tema) t3
                     ON     t1.id_tema = t3.id_tema
                                          
                     INNER  JOIN (select t4.id_tema,
                                         max(t4.id) id,
                                         count(*) pocetp
                                  FROM   forum_prispevek t4
                                  WHERE  t4.id_prispevek!=0
                                  GROUP  BY t4.id_tema) t5
                    ON     t1.id_tema = t5.id_tema


a pak na zacatku v dotazu:

select k.nazev kategorie,
       t.nazev tema,
       ifnull(p.pocet, 0) pocet,
       ifnull(p.pocetp, 0) pocetp,
       p.autor,
       p.datum


tak to nic nevypise
Kajman_
Profil *
tak jen jednoduše místo count(*) pocet dáte

sum(t2.id_prispevek=0) pocet,
sum(t2.id_prispevek!=0) pocetp
oiuoiuo
Profil *
dekuji moc za odpoved bohuzel nvm proc mi to nefunguje :(

pokud to nahradim za count ()... tak puvodni vysledek je ok ale s tim novym mi to proste nejde:
tzn. ze do select pridam ifnull(p.pocetp, 0) pocetp, tak mi to nevypise zadny vysledek pokud toto tam nedopisu je to ok
oiuoiuo
Profil *
respektive ok jen pro prvni POCET ale ne POCETP
Kajman_
Profil *
Tak jste to asi zkonil, těžko někdo uhádne, kde se stala chyba.
oiuoiuo
Profil *
tady je cely dotaz:

  SELECT k.pozice, t.pozice, 
         k.nazev kategorie_nazev,
         k.admin admin,       
         t.id id,
         t.nazev nazev,
         t.popis popis,
         ifnull(p.pocet, 0) pocet,         
         ifnull(p.pocetp, 0) pocetp,
         p.autor,
         p.datum
  FROM   forum_kategorie k
  INNER  JOIN forum_tema t
  ON     k.id = t.id_kategorie
  LEFT   OUTER JOIN (select t3.id_tema, t1.autor, t1.datum, t3.pocet
                     FROM   forum_prispevek t1
                     INNER  JOIN (select t2.id_tema,
                                         max(t2.id) id,
                                  sum(t2.id_prispevek=0) pocet,
                                  sum(t2.id_prispevek!=0) pocetp
                                  FROM   forum_prispevek t2

                                  GROUP  BY id_tema) t3
                     ON     t1.id_tema = t3.id_tema
                                          
                    
                            AND t1.id = t3.id) p
  ON     t.id = p.id_tema
  ORDER  BY 1, 2
Kajman_
Profil *
t3.pocet, t3.pocetp
oiuoiuo
Profil *
omg blba chyba, diky moc
oiuoiuo
Profil *
jak se tady dela to zvyrazneni urcite casti textu? :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0