Autor | Zpráva | ||
---|---|---|---|
oiuoiuo Profil * |
#1 · Zasláno: 25. 1. 2011, 15:11:09
Zdravim, tento dotaz mozna vic patri do databazi, ale tak nejak ho radsi dam sem.
Potreboval bych spojit nekolik dotazu v jeden pokud je to mozne. Ne ani tak z duvodu aby to byl ve finale funkcni script, ale i ze studijnich duvodu, abych zjistil jak spojit vic dotazu. moje jednotlive dotazy vypadaji takhle: (samozrejme toto neni funkcni reseni, ale co nejvic zjednoduseny) $x = select nazev,id from forum_kategorie where stav!=1 while ($x = $forum_kategorie) { echo $forum_kategorie[nazev]; $xx = select nazev,id from forum_tema where id_kategorie = $forum_kategorie[id] and stav!=1 while ($xx = $forum_tema) { echo $forum_tema[nazev]; $pocet = select count(id) from forum_prispevky where id_tema = $forum_tema[id] $test = select test from test where id_tema = $forum_tema[id] } } a muj pozadovany vystup: NAZEV z forum_kategorie nazev z forum_tema $pocet $test nazev z forum_tema $pocet $test ... NAZEV z forum_kategorie nazev z forum_tema $pocet $test ... ... a moje predstava je spojit vsechny dotazy do jednoho a pak s tim pracovat $db = dotaz while($neco = $fb) { ... } samozrejme uz jsem neco zkousel - spojit forum_kategori s forum_tema pres LEFT JOIN ovsem uz tam jsem narazil na problem, ze vystup byl: nazev kategorie nazev tema nazev kategorie nazev tema ... tzn. ze nazev kategorie se vypsal tolikrat kolikrat existuje tema dekuji za pomoc |
||
AM_ Profil |
#2 · Zasláno: 25. 1. 2011, 15:23:11
oiuoiuo:
„samozrejme uz jsem neco zkousel - spojit forum_kategori s forum_tema pres LEFT JOIN ovsem uz tam jsem narazil na problem“ tak už to při joinování bývá. Je to tak správně, výpis pak musíš ošetřit na straně PHP, tj např. $prevname = null; while ($row = $result->fetch_assoc()) { if ($row['name'] != $prevname) { $prevname = $row['name']; echo '<b>'.htmlspecialchars($prevname).'</b><br>'; } echo htmlspecialchars($row['content']).'<br>'; } samozřejmě musíš výsledky z DB seřadit podle name, aby byly se stejným name pohromadě. |
||
oiuoiuo Profil * |
#3 · Zasláno: 25. 1. 2011, 17:53:55
tak jsem trochu zkousel a vymyslel jsem tento dotaz:
select forum_kategorie.nazev as kategorie_nazev, forum_tema.*, (select COUNT(id) from forum_prispevek where id_tema=forum_tema.id ) as xx, (select autor from forum_prispevek where id_tema=forum_tema.id order by id desc) as xxx, (select datum from forum_prispevek where id_tema=forum_tema.id order by id desc) as xxxx from forum_kategorie,forum_tema where forum_kategorie.id=forum_tema.id_kategorie dotaz mne funguje temer dobre jedina chyba ze vysledek je porad jak bych nechtel: nazev z kategorie nazev z tematu nazev z kategorie .... jde to nejak resit na strasne mysql aby pod jednim vysledkem nazev z kategorie byly vypsany vsechny nazvy z teamu a dalsi vec je tento muj dotaz dobry, nebo si se dal nejak lip poresit? |
||
pcmanik Profil |
#4 · Zasláno: 25. 1. 2011, 18:02:51
oiuoiuo:
Toto sa da zjednodusit (select autor, datum from forum_prispevek where id_tema=forum_tema.id order by id desc) as xxx, (select datum from forum_prispevek where id_tema=forum_tema.id order by id desc) as xxxx na (select autor, datum from forum_prispevek where id_tema=forum_tema.id order by id desc) as xxx, Ale aj tak v php ti nikto s sql neporadi, preto smeruj svoje dotazy na tuto temu do patricnej temy na fore |
||
oiuoiuo Profil * |
#5 · Zasláno: 25. 1. 2011, 18:04:05
tady to zjednoduseni jsem zkousel ale nefunguje mi to
|
||
xmark Profil |
#6 · Zasláno: 25. 1. 2011, 18:06:56
oiuoiuo:
jde to nejak resit na strasne mysql aby pod jednim vysledkem nazev z kategorie byly vypsany vsechny nazvy z teamu A jak by sis ten výsledek představoval? To, co vrátí dotaz, je vždy pole, tzn. něco, co má X řádků a a Y sloupců. Zkus svou představu namalovat jako tabulku. > a dalsi vec je tento muj dotaz dobry, nebo si se dal nejak lip poresit? Je špatný. Použij to, co píše AM_ |
||
AM_ Profil |
#7 · Zasláno: 25. 1. 2011, 18:08:32
oiuoiuo:
připadá mi, že sis můj přispěvek vůbec nepřečetl. Ano, z relační databáze lezou data takhle a jejich přepracování na stromovou strukturu je nutné řešit až na straně PHP (neříkám, že to na straně MySQL nejde, možná se ti na to nakonec nějaké zvěrstvo povede vyrobit, ale nedělá se to tak). |
||
oiuoiuo Profil * |
#8 · Zasláno: 25. 1. 2011, 18:12:07
xmark:
pokud se nepletu AM_ mne resi pouze finalni spojeni vysledku, ale ja se ptam celkove na cely dotaz |
||
AM_ Profil |
#9 · Zasláno: 25. 1. 2011, 18:17:09 · Upravil/a: AM_
oiuoiuo:
možná jsem se špatně vyjádřil. na úrovni dotazu se toto NEŘEŠÍ, řeší se to až tím výstupem, proto jsem k dotazu nic nepsal; řešení s left joinem je správně. dotaz s vnořenými selecty v #3 už vůbec není správně, jednak se to takto také neřeší, druhak na MySQL doporučuji používat vnořené dotazy jen pokud je to opravdu nutné - jsou velmi špatně implementované co se týče rychlosti. Takže se vrať k LEFT JOINu, ten byl správně, a pro výpis použij variantu toho, co jsem ti poradil. |
||
oiuoiuo Profil * |
#10 · Zasláno: 25. 1. 2011, 18:17:29
xmark:
no z tou tabulkou jakou bych si ja predstavoval jsi me primnel k tomu, ze jsem zjistil ze nedosahnu svyho vysledku ;) protoze pokud se nepletu moje vysledna tabulka vypada: nazev_kategorie, nazev, xxx .... neco neco xxx a pro mou potrebu nedosahnu vysledku jakej bych chtel jen pomoci db |
||
oiuoiuo Profil * |
#11 · Zasláno: 25. 1. 2011, 18:18:36
AM:
jenze mam problem v tom ze spojeni tech dvou tabulek left joinem neni problem, ale nvm jak tam dostat dalsi data ktery taham (select COUNT.... |
||
AM_ Profil |
#12 · Zasláno: 25. 1. 2011, 18:19:41
AM: „tak už to při joinování bývá. Je to tak správně, výpis pak musíš ošetřit na straně PHP“
oiuoiuo: „a pro mou potrebu nedosahnu vysledku jakej bych chtel jen pomoci db“ gratuluji. > neco > neco xxx pod tím se velmi špatně představuje, co je v databázi ve skutečnosti. |
||
AM_ Profil |
#13 · Zasláno: 25. 1. 2011, 18:20:54
[#11] oiuoiuo
tak napiš srozumitelně, co vlastně chceš z databáze zjistit. (né tohle z tamté tabulky a spojit do dotazu, ale třeba "seznam všech vláken a počet příspěvků v nich"). |
||
oiuoiuo Profil * |
#14 · Zasláno: 25. 1. 2011, 18:26:02
jde mi o to udelat "forum" respektive jeji hlavni stranu:
kde budou nadepsany kategorie (forum_kategorie): O WEBU, POKEC ... a v nich budou primo temata z tabulky (forum_tema) tzn: O WEBU -pravidla -neco POKEC -o vsem k tomu chcu spocitat pocet prispevku v danym tematu (pravidlech, neco, o vsem) a zjisteni posledniho prispivajici a datum z tabulky forum_prispevek vysledek: O WEBU -pravidla 10 25.1.2011 admin - neco 0 POKEC - o vsem 1 22.2.2000 user |
||
AM_ Profil |
#15 · Zasláno: 25. 1. 2011, 18:38:59
tak to opravdu není úplně triviální. název tématu a počty příspěvků takto:
SELECT nazev_tematu, COUNT(id_prispevek) FROM temata LEFT JOIN prispevky ON temata.id_tema=prispevky.id_tema údaje o posledním příspěvku už se asi bez vnořených dotazů neobejdou, případně to můžeš udělat tak, že údaj o posledním přispěvateli a datum budeš udržovat v tabulce příspěvků - sice si pak musíš pohlídat konzistenci když např. někdo poslední příspěvek smaže, ale je to jednodušší na naprogramování dotazu. |
||
oiuoiuo Profil * |
#16 · Zasláno: 25. 1. 2011, 18:47:33
AM:
jenze do toho se musi jeste spojit tabulka z kategoriema |
||
AM_ Profil |
#17 · Zasláno: 25. 1. 2011, 18:59:57
SELECT nazev_kategorie, nazev_tematu, COUNT(id_prispevek) FROM kategorie LEFT JOIN temata ON kategorie.id_kategorie=temata.id_kategorie LEFT JOIN prispevky ON temata.id_tema=prispevky.id_tema GROUP BY temata.id_tema --na tohle jsem predtim zapomnel, to tam musi byt vzdy a pro ošetření výpisu platí [#2] AM |
||
oiuoiuo Profil * |
#18 · Zasláno: 25. 1. 2011, 19:18:16
v soucasne dobe to mam takhle:
SELECT forum_kategorie.nazev as kategorie_nazev, forum_prispevek.autor as autor, forum_prispevek.datum as datum, forum_prispevek.id as neco, forum_tema.nazev as nazev, FROM forum_kategorie LEFT JOIN forum_tema ON forum_kategorie.id=forum_tema.id_kategorie LEFT JOIN forum_prispevek ON forum_tema.id=forum_prispevek.id_tema coz funguje stejne jak pred tim s tim, ze tam mam navic AUTORA a DATUM ale nejde mne secist pocet id prispevku pokud dam COUNT(forum_prispevek.id) tak mne vrati pouze jeden radek |
||
Časová prodleva: 13 let
|
0