Autor Zpráva
oiuoiuo
Profil *
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
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 *
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
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 *
tady to zjednoduseni jsem zkousel ale nefunguje mi to
xmark
Profil
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
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 *
xmark:

pokud se nepletu AM_ mne resi pouze finalni spojeni vysledku, ale ja se ptam celkove na cely dotaz
AM_
Profil
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 *
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 *
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
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
[#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 *
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
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 *
AM:

jenze do toho se musi jeste spojit tabulka z kategoriema
AM_
Profil
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 *
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

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