Autor | Zpráva | ||
---|---|---|---|
oiuoiuo Profil * |
#1 · Zasláno: 25. 1. 2011, 20:10:32
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 |
#2 · Zasláno: 25. 1. 2011, 20:33:43
Ten kod ti funguje? lebo o tom dost pochybujem...
|
||
oiuoiuo Profil * |
#3 · Zasláno: 25. 1. 2011, 20:40:59
samozrejmne ze ne je to jen ukazka v rychlosti jak se to da vyresit, ale jak to nechci ;)
|
||
Kajman_ Profil * |
#4 · Zasláno: 26. 1. 2011, 08:45:37
nejak vsechno nacpal do jednoho
http://php.vrana.cz/srovnani-dotazu-do-zavislych-tabulek.php |
||
oiuoiuo Profil * |
#5 · Zasláno: 26. 1. 2011, 13:27:53
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 * |
#7 · Zasláno: 26. 1. 2011, 21:10:53
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 * |
#9 · Zasláno: 27. 1. 2011, 10:33:57
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 * |
#10 · Zasláno: 27. 1. 2011, 13:46:06
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 * |
#11 · Zasláno: 27. 1. 2011, 14:52:56
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... |
||
Časová prodleva: 12 dní
|
|||
oiuoiuo Profil * |
#12 · Zasláno: 8. 2. 2011, 18:31:28
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 * |
#13 · Zasláno: 8. 2. 2011, 19:01:05
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 * |
#14 · Zasláno: 8. 2. 2011, 19:28:47
tak jen jednoduše místo count(*) pocet dáte
sum(t2.id_prispevek=0) pocet, sum(t2.id_prispevek!=0) pocetp |
||
oiuoiuo Profil * |
#15 · Zasláno: 8. 2. 2011, 19:34:23
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 * |
#16 · Zasláno: 8. 2. 2011, 19:37:00
respektive ok jen pro prvni POCET ale ne POCETP
|
||
Kajman_ Profil * |
#17 · Zasláno: 8. 2. 2011, 19:37:28
Tak jste to asi zkonil, těžko někdo uhádne, kde se stala chyba.
|
||
oiuoiuo Profil * |
#18 · Zasláno: 8. 2. 2011, 19:40:55
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 * |
#19 · Zasláno: 8. 2. 2011, 19:45:11
t3.pocet, t3.pocetp |
||
oiuoiuo Profil * |
#20 · Zasláno: 8. 2. 2011, 19:56:03
omg blba chyba, diky moc
|
||
oiuoiuo Profil * |
#21 · Zasláno: 8. 2. 2011, 19:57:22
jak se tady dela to zvyrazneni urcite casti textu? :)
|
||
Časová prodleva: 13 let
|
0