Autor Zpráva
Pechy.cz
Profil
Zdravím,
potřeboval bych poradit s výpisem z databáze.
Jde mi o to, že vypisuji všechny řádky z tabulky spojená s druhou tabulkou. A v druhé tabulce ve sloupci "pod1" se objevuje třeba na 10 řádcích stejná hodnota, která se vrací zase do tabulky 1., ale já ji potřebuju vypsat jen 1x a pak pokračovat na další hodnotu. Poradíte prosím, jak to udělat?

Kód:
$sql = mysql_query("SELECT * FROM `obsah` WHERE `kategorie`='GRAFIKA'");
        while ($vypis = mysql_fetch_array($sql, MYSQL_ASSOC)) {  

  $nazev = $vypis['nazev'];
  $id = $vypis['id'];

$q2 = "SELECT * FROM cesta WHERE `clanek`='$id'";
$r2 = mysql_query($q2) or die(mysql_error());
 $row2 = mysql_fetch_array($r2);
  $pod1 = $row2['pod1'];
  if ($pod1!='0' && $pod1!='') { 
    $q11 = "SELECT * FROM obsah WHERE `id`='$pod1'";
    $r11 = mysql_query($q11) or die(mysql_error());
     $row11 = mysql_fetch_array($r11);
       $nazev1 = $row11['nazev'];
  }

    if ($nazev1!='') { echo "$nazev1<br>"; }
    else { echo "$nazev<br>"; }
  

} mysql_free_result($sql);

Doufám, že jsem to napsal alespoň nějak srozumilteně. Děkuji za odpověď
Taps
Profil
Pechy.cz:
Nejčastější potíže s PHP (FAQ) » Nadpis skupiny nejen při výpisu z databáze
Seki
Profil
Pechy.cz:
ten kód je humus
1) mysql_fetch_array($sql, MYSQL_ASSOC) nahraď mysql_fetch_assoc ($sql)
2) zkus trochu jinak používat tabulátor
3) $nazev = $vypis['nazev']; - na tohle zapomeň, zbytečně to zpomaluje kód
4) dvakrát načítáš data z 1 tabulky - zbytečné plýtvání výkonem serveru (jednou si už ty data získal tak na co se na ně dotazovat znova)
5) proměnné zkus pojmenovávat tak, aby bylo poznat co je v nich uloženo
Chuchycek
Profil
Ahoj,

hele to co si napsal, je docela nesrozumitelné zkus to prosím tě trochu rozvinout, co by to cca mělo dělat. A já se ti na to mrknu :-)
Taps
Profil
Chuchycek:
samotná funkčnost bude zachována, jde jen o optimalizaci kodu, optimalizaci mysql dotazu a tabulátory kvůli přehlednosti kodu.
Pechy.cz
Profil
Vím, že je to humus... Když to teda poupravím

$sql = mysql_query("SELECT * FROM `obsah` WHERE `kategorie`='REKLAMA'");
 while ($vypis = mysql_fetch_assoc ($sql)) {  
 
    $q2 = "SELECT * FROM cesta WHERE `clanek`='$vypis[id]'";
    $r2 = mysql_query($q2) or die(mysql_error());
        $row2 = mysql_fetch_array($r2);
        $podkategorie = $row2['pod1'];
 
        if ($podkategorie!='0' && $podkategorie!='') { 
        $q11 = "SELECT * FROM obsah WHERE `id`='$podkategorie'";
        $r11 = mysql_query($q11) or die(mysql_error());
           $row11 = mysql_fetch_array($r11);
           $nazevpodkategorie = $row11['nazev'];
        }
 
    if ($nazevpodkategorie!='') { echo "$nazevpodkategorie"; }
    else { echo "$vypis['nazev']"; }
  
 
} mysql_free_result($sql);

Doufám, že už je to trochu lepší. Pro mě tedy ano.
No, ale jde mi to to, že po tomto kódu dostanu výpis:

Reklamní dárkové předměty
Reklamní dárkové předměty
Reklamní dárkové předměty
Potisk
Potisk
Potisk
Potisk
Potisk
Jarní sleva potisku
Balící pásky s potiskem

A já tam potřebuji vše jen 1x. Pro vysvětlení:
V tabulce obsah jsou články celého webu. Tabulka cesta obsahuje informace, do jakých kategorií články patří.
Př. Článek Ceník patří do Reklamích dárkových předmětů a ty patří do REKLAMY.
Takže se dotážu (cesta), kam patří Ceník - ta mi vyjede, že patří pod článek Reklamní dárkové předměty. ( "pod1" = "31"; 31 => Reklamní dárk... )
No a já se pak zase ptám, kam patří ty, atd, atd. Ale teď potřebuju vypsat všechny hlavní podkategorie. Jelikož web nemá kategorie nijak zvlášť tvořený, ale kategorií se stává v podstatě jakýkoliv článek, tak jsem vytáhl všechny články, zjistil do čeho patří, do čeho patří to, a to patří do ... až jsem se dostal úplně nahoru (REKLAMA >> Reklamní dárkové předměty) - to potřebuju. Jenže v té cestě jsou třeba 4x. A já je potřebuju jen 1x.. O to mi tu jde.
Chuchycek
Profil
Jenže nechápu proč se dvakrát dotazuješ na uplně stejnou tabulku, tj. tabulka obsah?
Hando
Profil
Na odstranění duplicitních položek z výpisu se dá použít "DISTINCT", tedy něco ve smyslu "SELECT DISTINCT FROM kategorie...".

Otázkou je, jestli spíš není problém ve špatném návrhu databáze.
Pechy.cz
Profil
Chuchycek:
Zase tak moc s databází neumím... Nevím, jak vybrat všechny položky, najít k nim cestu a pak se vrátit a najít položky jim nadřazený...

// EDIT
Jsem *****... už jsem na to přišel. zbytečně přemýšlím nad zbytečnostma, přitom stačilo odebrat půlku kódu a změnit jedno znaménko. Nakonec jsem to vyřešil tak, že po výtahu z obsahu se to dotáže "který článek není podkategorií" (pod1 == "0") ...
A je to vyřešeno. To je prostě tak, když už jsem dlouho v práci a pak přemýšlím, jak to nebude složitý...

Výsledek:
$sql = mysql_query("SELECT * FROM `obsah` WHERE `kategorie`='REKLAMA'");
  while ($vypis = mysql_fetch_assoc ($sql)) {  

      $q2 = "SELECT * FROM cesta WHERE `clanek`='$vypis[id]'";
      $r2 = mysql_query($q2) or die(mysql_error());
      $row2 = mysql_fetch_array($r2);
        if ($row2['pod1']=="0") { echo " $vypis[nazev]<br>"; }

 } mysql_free_result($sql);
Chuchycek
Profil
l[#8] Hando
DISTINCT by mu pomohl v jeho případě pokud by ty tabulky propojil přímo v dotazu, jenže on má dotazy rozdělené do proměnných


[#9] Pechy.cz
To jsem přesně myslel, proto jsem se ptal proč se dvakrát dotazuješ na tu samou tabulku...

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: