« 1 2
Autor Zpráva
mimochodec
Profil
Příčinu chyby nevidím. Jestliže ve sloupci "nazov" je vždy název, k tomu, co píšeš, nemá jak dojít. Odpověz na #29, ukaž data, stačí 10 řádků.
tiso
Profil
PP06: „Avatar - Scifi, Akčný, 3D
... GROUP_CONCAT(zaner SEPARATOR ', ') ... GROUP BY nazov ...
PP06
Profil
Tak sa mi nakoniec podarilo vymyslieť niečo čo funguje presne ako som chcel:
$vysledok = mysql_query("SELECT datum, nazov, umiestnenie, zaner
    FROM vazobna_tabulka, datum_filmu, nazov_filmu, umiestnenie_filmu, zaner_filmu
    WHERE id_datumu=idd AND id_filmu=idf AND id_umiestnenia=idu AND id_zanru=idz ORDER BY idf DESC", $spojenie);
    echo '<BR><BR><B>Posledných desať pridaných filmov:</B><BR><BR>';
    echo '<TABLE RULES="ROWS" ALIGN="LEFT" BORDER="1" BORDERCOLOR="#FFFFFF" WIDTH="590">';
    echo '<TR><TD WIDTH="75"><B>Dátum:</B></TD><TD><B>Názov:</B></TD><TD><B>Žáner:</B></TD><TD WIDTH="160"><B>Umiestnenie:</B></TD></TR>';
    $poslednipouzity = '';
    $pocet = 0;
    while ($zaznam = mysql_fetch_array($vysledok) ): 

     if ($poslednipouzity != $zaznam["nazov"] && $poslednipouzity != '' && $pocet <= 9) {
      echo '</P></TD><TD><P>'.$umiestnenie.'</P></TD></TR>';
      $poslednipouzity = '';
     }

     if ($poslednipouzity != $zaznam["nazov"] && $pocet <= 9) {
      echo '
      <TR><TD><P>'.$zaznam["datum"].'</P></TD><TD><P>'.$zaznam["nazov"].'</P></TD><TD><P>';
      $pocet = $pocet + 1;
     }
     
     if ($poslednipouzity == '' && $pocet <= 10) {
      echo $zaznam["zaner"];
     }

     if ($poslednipouzity == $zaznam["nazov"] && $pocet <= 10) {echo ', '.$zaznam["zaner"];
     }
     
     $poslednipouzity = $zaznam["nazov"];
     $umiestnenie = $zaznam["umiestnenie"];
    endwhile;
    echo '</P></TD><TD><P>'.$umiestnenie.'</P></TD></TR>';
    echo '</TABLE>';}
Keeehi
Profil
Skvělé, dále je třeba zoptimalizovat SQL dotaz protože jak jsi ho vytvořil ty, tak náročnost jeho provedení extrémně vzrůstá s každým přidaným řádkem do jakékoli z pěti tabulek. Tomu co jsi vytvořil se říká cross join. Ten dotaz nejdříve vygeneruje obří tabulku ve které jsou všechny možné kombinace řádků ze všech tabulek. A to se pak filtruje těmi podmínkami ve where. Ta velká tabulka bude mít velikost (počet řádků tabulky 1 * přt2 * přt3 * přt4 * přt5). Pokud bude mít každá tabulka 1000 záznamů, počet řádků té velké bude milión miliard. Pokud použiješ inner join, lepí to k sobě jen řádky tabulek které jsou validní a ta tabulka bývá několikanásobně menší.
PP06
Profil
Keeehi:
A nechceš mi poradiť ako? Našiel som síce český návod, kde dotyčný robil "vnorený dopyt" ako to nazval (to asi myslíš aj ty), ale robil to len v dvoch jednoduchých tabuľkách. Ja to mám všetko pospájané cez väzobnú tabuľku ako mi bolo poradené a vôbec netuším ako by som to mal spraviť, som rád že som vôbec vitvoril to čo som vytvoril a funguje to. Takto vypadal ten jeho príklad:
SELECT údaje FROM tabuľka WHERE (SELECT agregačná funkcia FROM tabuľka)
A pre upresnenie moja databáza "filmy" má tabuľky zo stĺpcami:
1. "nazov_filmu" -idf -nazov
2. "datum_filmu" -idd -datum
3. "umiestnenie_filmu" -idu -umiestnenie
4. "zaner_filmu" -idz -zaner
5. "vazobna_tabulka" -id_datumu -id_filmu -id_zanru -id_umiestnenia

A ešte priložím do kotla, na tej stránke kde mám tento dotaz mám select kde je na výber 48 hodnôt (zoradenie podla abecedy pre každé písmeno, zoradenie podla každého žánru a zoradenie posledných pridaných). A fakt nechci aby som sem poslal kompletný kód tej stránky, pretož má cez 1000 riadkov, pokúšal som sa vytvoriť aj vlastnú funkciu ktorá by to zkrátila ale nešlo mi to, proste toto je jediné čo som dokázal stvoriť (aj to z vašou veľkou pomocou). Ak mi poradíš ako uľahčiť servru a aj tomu kódu, rád to prerobím, len som si neni istý či sa dotoho chceš pustiť.
Keeehi
Profil
SELECT ...
FROM nazov_filmu
INNER JOIN vazobna_tabullka ON nazov_filmu.idf = vazobma_tabulka.id_filmu
INNER JOIN datum_filmu ON datum_filmu.idd = vazobna_tabulka.id_datumu
INNER JOIN umiestenie_filmu ..

Je to víceméně to samé, jen čárky mezi tabulkami nahradíš INNER JOIN a výrazy z WHERE přesuneš za ON.
PP06
Profil
Tak sa mi to podarilo a dokonca som zredukoval ten moj script z 1000 riadkov na 165 :)
Bohužial to čo mi radil tiso mi niako nefungovalo, ale použil som tú logiku čo sme vypracovali z mimochodecom a ta funguje.
Ostáva mi tu asi posledná chyba ktorú vidím a to je triedenie výsledkov podľa abecedy. To mám, ale chcel som este zoskupiť všetky filmy ktoré sa nezačínajú žiadnym písmenom abecedy (čiže sa začínajú napr.: 1 6 / ... čímkolvek čo dovolí formulár uložíť do databázy).
Skúšal som to takto a nešlo mi to:
NOT LIKE 'A%' AND NOT LIKE 'B%'....... AND NOT LIKE 'Z%' Je to umiestnené v tom selecte takmer na konci.
tiso
Profil
PP06: „dokonca som zredukoval ten moj script z 1000 riadkov na 165
Tak sa pochváľ čo si vytvoril a vlož ho sem.
mimochodec
Profil
PP06:
Teď se "pochlubím" kódem z jednoho z webů, kterými jsem začínal. Dneska bych možná hledal a našel chytřejší postup, tehdy jsem to udělal takhle:

if ( in_array($strLetter, array("B","F","G","H","J","K","M","P","Q","V","W","X"))) { $strLetterF = "= '".$strLetter."'";};  

if ( $strLetter=="A") { $strLetterF = "IN ('A', 'Á')"; };  
if ( $strLetter=="C") { $strLetterF = "IN ('C', 'Č')"; };  
if ( $strLetter=="D") { $strLetterF = "IN ('D', 'Ď')"; };  
if ( $strLetter=="E") { $strLetterF = "IN ('E', 'É', 'Ě')"; };  
if ( $strLetter=="I") { $strLetterF = "IN ('I', 'Í')"; };  
if ( $strLetter=="L") { $strLetterF = "IN ('L', 'Ľ')"; };  
if ( $strLetter=="N") { $strLetterF = "IN ('N', 'Ň')"; };  
if ( $strLetter=="O") { $strLetterF = "IN ('O', 'Ó')"; };  
if ( $strLetter=="R") { $strLetterF = "IN ('R', 'Ř')"; };
if ( $strLetter=="S") { $strLetterF = "IN ('S', 'Š')"; };
if ( $strLetter=="T") { $strLetterF = "IN ('T', 'Ť')"; };  
if ( $strLetter=="U") { $strLetterF = "IN ('U', 'Ú')"; };  
if ( $strLetter=="Y") { $strLetterF = "IN ('Y', 'Ý')"; };
if ( $strLetter=="Z") { $strLetterF = "IN ('Z', 'Ž')"; };


if ( $strLetter=="1") { $strLetterF = "NOT IN ('A','Á','B','C','Č','D','Ď','E','É','Ě','F','G','H','I','Í','J','K','L','Ľ','M','N','Ň','O','Ó','P','Q','R','Ř','S','Š','T','Ť','U','Ú','V','W','X','Y','Ý','Z','Ž')";};   

..

... " where UCASE( LEFT( nazvy.original, 1 )) ".$strLetterF; 

$strLetter je proměnná, která vznikla po ošetření GETu. V něm je buď písmeno, nebo "1" pro "ostatní".
PP06
Profil
Tak sa mi to podarilo, stačilo sa nato iba poriadne vyspať :) (ale zabudol som na ˇ a ´ ,takže som to tam podorábal). Stačilo do zblbnutia opakovať nasledovné:
nazov NOT LIKE 'A%' AND nazov NOT LIKE 'Á%'....... AND nazov NOT LIKE 'Ž%'

tiso:
Kód už nemám, a ten GROUP_CONCAT som si googlil ako sa to používa, kam sa to vkladá a pod. Ale maximum čo som ztoho dostal bolo že mi to vypísalo iba jeden žáner ku každému filmu.
PP06
Profil
:( Vždy keď už si myslím že je hotovo, tak objavím ďalšiu chybu, alebo mi ju objaví dakto iný, tento raz som si našiel dve.

1. chyba je slovenská abeceda. Napríklad zoradenie filmov ktoré sa začínajú na A mám v selecte riešené takto:
nazov LIKE 'A%' OR nazov LIKE 'Á%' OR nazov LIKE 'Ä%'
Problém je že to vypíše všetky záznamy ktoré sa začínajú na: a á ä A Á Ä ĺ Ĺ a možno aj ďalšie. (obdobné problémi mi robia viaceré písmená z diakritikov, dá sa to dáko ošetriť? Alebo bude potrebné prekopať zase celý kód?

2. chyba sa týka umiestnenia filmu. Každú zložku kde sa nachádzajú filmy mám 2x (jednu pre normálne, druhú pre 3d). Preto som chcel že ak má film žáner "3D" tak to vypíše upravené umiestnenie ako pre obyčajný. Ošetril som to v riadkoch: 2, 5-9 a 16. Problém je riadok 16, spôsobí to že stránka sa načíta prázdna. (ak namiesto riadku 16 zadefinujem iba premennú $cesta z hodnotov 1 alebo 0 tak zvyšok funguje perfektne). Ztoho mi vyplíva že mám chybnú podmienku, bohužial všetky moje pokusy opraviť ju zlyhali. (v databázi mám záznam: idz=1 zaner=3D)
    $poslednipouzity = '';
    $cesta = 0;
    while ($zaznam = mysql_fetch_array($vysledok) ): 

     if ($poslednipouzity != $zaznam["nazov"] && $poslednipouzity != '' && $cesta != 1) {echo '</P></TD><TD><P>'.$umiestnenie.'</P></TD></TR>';
      $poslednipouzity = '';}
     if ($poslednipouzity != $zaznam["nazov"] && $poslednipouzity != '' && $cesta == 1) {echo '</P></TD><TD><P>3D\\'.$umiestnenie.'</P></TD></TR>';
      $cesta = 0;
      $poslednipouzity = '';}

     if ($poslednipouzity != $zaznam["nazov"]) {echo '
      <TR><TD><P>'.$zaznam["datum"].'</P></TD><TD><P>'.$zaznam["nazov"].'</P></TD><TD><P>';}
     if ($poslednipouzity == '') {echo $zaznam["zaner"];}
     if ($poslednipouzity == $zaznam["nazov"]) {echo ', '.$zaznam["zaner"];}

     if (3D == $zaznam["zaner"]) {$cesta = 1;}

     $poslednipouzity = $zaznam["nazov"];
     $umiestnenie = $zaznam["umiestnenie"];
    endwhile;
mimochodec
Profil
První bod se týká nastavení porovnávání v databázi. S tím teď úplně neporadím. Druhému bodu vůbec nerozumím, ale toto je určitě špatně: if (3D == $zaznam["zaner"])

3D patří do uvozovek, protože je to řetězec. Jestli to vyřeší tvůj problém, nevím.
PP06
Profil
Nevyriesi, skusal som to.
A ktomu druhemu bodu, povedzme že mám film a záznam v databázi:
Avatar zo žánrami: akčný a umiestnenie filmu je Filmy\Akčné
a druhý film:
Mimoni zo žánrami: 3d, rozprávka a umiestnenie filmu je Filmy\rozprávky

Tak ten script má vytvoriť pre prvý film toto: umiestnenie: Filmy\Akčné
a pre druhý film toto : 3D\Filmy\rozprávky
mimochodec
Profil
Vidím několik chyb:
- co když má film víc žánrů? Co je vlastně cílem rozložení filmů do složek? Toho, kdo to bude stahovat, název složky nezajímá.
- v názvech souborů a složek nepoužívej diakritiku a velká písmena.
- jestli děláš nějaký server na stahování filmů, tak bych si nejdřív ověřil limity. Nejen velikosti dat, ale hlavně velikosti nahrávaných souborů.
- pokud se s výše uvedeným nějak vypořádáš a opravdu to budeš chtít udělat, úplně bych vyhodil všechny složky "Akčné", "rozprávky" a další. Když použiješ třeba klíč "soubory/2015-10-24", ušetříš si spoustu práce. A dělat "3D" je úplně divný krok. Pro tu informaci si jen udělej sloupec v tabulce filmů, promítat to do struktury složek je jen komplikace.


Jen ještě dodám, že ani tu podsložku pojmenovanou podle data by aplikace jako taková nepotřebovala. Důvodem k jejímu použití je limit počtu souborů v jedné složce. Mám pocit, že to číslo je 65535, možná se to liší podle nastavení serveru, ale každopádně nějaký limit existuje, takže z principu musíš zajistit, aby soubory nepřibývaly jen v jedné složce (nebo několika málo, jaks to nadhodil ty).
PP06
Profil
Celé si to vzal za špatný koniec, nejedná sa o žiaden server odkiaľ si niekto niečo bude sťahovať. Ide len o databázu filmov čo mám doma. Zmena systému uloženia je síce možná, ale ako sa to bude hladať (hlavne v telke) ked tam budem mať xy adresárov z dátumom, alebo ine nezmysly. Diakritiku nepoužívam, ktomu ste ma donútili iba vy :) Z veľkými písmenami je to horšie, ale to problém vôbec nieje vypisuje to ten údaj pekne. A už vôbec nebudem mať 65 000 filmov celkovo nie to v jednej zložke. Áno filmy budú mať viac žánrov, ale bude umiestnený iba v jednej zložke (úspora miesta).

A radšej napíšem vysvetlenie celého toho:
Príde niekto (ja, žena, deti....) že si ide pozrieť film, ale nevie aký. Spusťí stránku, tam sa zobrazí 10 najnovších a môže si vybrat podľa žánru (napríklad dnes mám chuť pozriet si scifi) alebo chce vidieť dáky konkrétny film, kde si pametá že sa začínal na A alebo dáko tak tak si vyberie zoradenie podla abecedy a hladá.
A výsledok je taký že vídí dátum kedy som zohnal ten film, názov, žánre a umiestnenie a vie kde ho hladať.
mimochodec
Profil
V tom případě bych měl asi složky A-Z a "ostatní" a filmy fyzicky v nich. Přes databázi bych řešil jen vyhledání. Klikneš na Komedie, uvidíš Hot Fuzz, jdeš do složky H, v pár desítkách souborů podle abecedy ho najdeš rychle.
« 1 2

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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