Autor | Zpráva | ||
---|---|---|---|
mimochodec Profil |
#1 · Zasláno: 17. 10. 2015, 18:08:03
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 |
#2 · Zasláno: 19. 10. 2015, 09:13:49
PP06: „Avatar - Scifi, Akčný, 3D“
... GROUP_CONCAT(zaner SEPARATOR ', ') ... GROUP BY nazov ... |
||
PP06 Profil |
#3 · Zasláno: 20. 10. 2015, 18:57:55
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 |
#4 · Zasláno: 20. 10. 2015, 22:05:02
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 |
#5 · Zasláno: 21. 10. 2015, 16:21:21
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) 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 |
#6 · Zasláno: 22. 10. 2015, 03:12:38
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 |
#7 · Zasláno: 23. 10. 2015, 23:26:46
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 |
#8 · Zasláno: 23. 10. 2015, 23:58:08
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 |
#10 · Zasláno: 24. 10. 2015, 12:27:22
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 |
#11 · Zasláno: 24. 10. 2015, 17:10:01
:( 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 'Ä%' 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 |
#12 · Zasláno: 24. 10. 2015, 18:06:19
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 |
#13 · Zasláno: 24. 10. 2015, 18:20:36
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 |
#15 · Zasláno: 24. 10. 2015, 23:00:01
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 |
#16 · Zasláno: 24. 10. 2015, 23:22:03
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.
|
||
Časová prodleva: 9 let
|
0