Tak věc se má takto, mám dvě tabulky.
První je "mmh_file_storage" kde jsou fotky, k nim ID člověka který je uploadnul a počet návštev dané fotky vše na jednom řádku. Tak je to u každé uploadnuté fotky.
Druhá je mmh_user_info ve které je výpis lidí, včetně jejich ID a do této potřebuju dát hodnotu zobrazeni, která by byla součet všech zobrazení fotek u jednoho uživatele.
Pro příklad : uživatel Honza uploadnul fotky "dovolena.jpg" (shledlo ji 10 lidí) "more.jpg" (shedlo 8 lidí) a "písek.jpg" (shlédli 2). Tyto hodnoty jsou v té první tabulce. A já potřebuju aby u Honzy se v druhé tabulce do zobrazení zapsalo k Honzovi číslo 20.
Jen už mi to vubec nemyslí a nemám žádný nápad. Můžete mi poradit? Chápete co potřebuji?
Všem moc díky předem za pomoc :)
Fórum › PHP
Součet hodnot
Nahlásit jako SPAM
IP: 84.38.187.–Něco ve smyslu:
SELECT
mmh_user_info.id AS id, mmh_user_info.jmeno AS jmeno, ...,
SUM(mmh_file_storage.pocet_navstev_k_jedne_fotce)
AS pocet_navstev_k_uzivatelovo_fotkam_celkem
FROM mmh_user_info
LEFT JOIN mmh_file_storage
ON mmh_user_info.id = mmh_file_storage.uzivatelovo_id
GROUP BY mmh_user_info.id?
Nahlásit jako SPAM
IP: 85.70.13.–To baryman : no ale to je celkem blbost... preci nebudes nejakou hodnotu ukladat jeste nekde jinde... a pokud to tak opravdu chces, tak se z bukajova sql vytaznes z vysledku 'pocet_navstev_k_uzivatelovo_fotkam_celkem' a ulozis si to to te sve druhé tabulky
Nahlásit jako SPAM
IP: 193.179.169.–baryman
ale potřeboval bych to jako PHP kód
To je tak těžké ho napsat? Prostě vybereš tímto dotazem z databáze, co potřebuješ (nejspíše bude stačit id a pocet_navstev_k_uzivatelovo_fotkam_celkem, jestliže je id primarním klíčem), procházíš výsledky dotazu a postupně podnikáš UPDATy.
Nebo další možnost, mnohem čistší a jednodušší – vytvoříš si z tohoto dotazu view, a pak uděláš UPDATE ze dvou tabulek (UPDATE mmh_user_info AS ui, nazev_view AS v SET ui.zobrazeni = v.pocet_navstev_k_uzivatelovo_fotkam_celkem).
Ale osobně bych se tohoto počínání vyvaroval. Ukládat ten počet zobrazení celkem do tabulky k uživateli je zbytečné, protože se dá právě získat jinak. Pokud se opravdu chcceš tvářit, že se jedná jen o jednu tabulku, vytvoření jen toho view by asi bylo nejjednodušší. Pokud se bojíš o výkon, lepší než „cachování“ v databázi bude podle mě vybraná data normálně cachovat v aplikaci.
Nahlásit jako SPAM
IP: 85.70.13.–To baryman : no tak je tak slozite kdyz zvysujes counter u fotky zvysit take counter u uzivatele???
Nahlásit jako SPAM
IP: 193.179.169.–Nebylo bo, JENZE ten počet shlednuti u fotky je dán v další tabulce IP, kde počet tech nástev získám takto :
// $nazev je promena danné fotky
$sql2 = mysql_query("SELECT * FROM ip");
$zaznam = mysql_fetch_array($sql2);
$zobrazeni = mysql_num_rows(mysql_query("SELECT * FROM ip WHERE fotka = '$nazev'"));
no proste sečtu řádky z tabulky IP (sloupce : fotka, ip, datum) kde se shoduje FOTKA s názvem fotky na které zrovna návstevník je. Potom zapíšu do tabulky mmh_file_storage do sloupce "navstevy". Jen nevím jak to mám udelat aby se to ukládalo i do té druhé tabulky přímo k danému člověku :(
Nahlásit jako SPAM
IP: 84.38.187.–To baryman :
Snažím sa pochopiť, no nejako mi to nejde:
Máš nejakú tabuľu, "ip" kde jeden riadok predstavuje jedno zobrazenie nejakej fotky. O akú fotku ide máš v stringovom stĺpci "fotka". Pri každom zobrazení fotky pridáš do tejto tabuľky riadok. Keď chceš zistiť počet zobrazení niektorej fotky, zavoláš SELECT * from ip WHERE FOTKA = nazov. Potom, čo sa všetky tie dáta z mysql pretiahnu do PHP, zistíš koľko to bolo riadkov a to považuješ za počet zobrazení tej fotky.
Tento zistený údaj potom zapíšeš do tabuľky spomenutej v tvojom prvom poste (mmh_file_storage) ku konkrétnej fotke, predpokladám že asi nejako takto:
Mysql_query('update mmh_file_storage set počet návštev = zistena hodnota where fotka = fotka...
Prosím potvrď, či je to tak, alebo to upresni, pred tým než budem pokračovať...
Nahlásit jako SPAM
IP: 213.160.186.–jednoduché veci riešiš strašne komlikovanou a škaredou cestou a potom je ťažké dorobiť do toho nejakú banalitu.
Ten návrh je totálny chaoz. Kôli jednej fotke preťahuješ pomaly celú tabuľku. Máš vôbec tušenie ako sa pri tom mysqlka namaká? A o využití pamäte nehovorím...
Príklad: keď zavolaš toto:
$zobrazeni = mysql_num_rows(mysql_query("SELECT * FROM ip WHERE fotka = '$nazev'"));
Najprv mysl prebehne celú tabuľku (alebo len index, pokiaľ ho máš) a všetky riadky, ktoré vyhovujú pošle do php. Z celého tohto kvanta dát, sa nevyužije ani jedna bunka - použije sa iba počet riadkov.
Už len toto by šlo podstatne zrýchliť takto: $zobrazeni = mysql_result(mysql_query("SELECT count(*) FROM ip WHERE fotka = '$nazev'"),0);
Nemá zmysel riešiť konkrétnu úlohu, skôr navrhnúť lepší dátový model. Ak sa jedná o zabehnutý systém, budeš potrebovať poriadne veľa leukoplastu...
Nahlásit jako SPAM
IP: 213.160.186.–pri každom zobrazení fotky zvys pocty zobrazeni pri fotke aj pri uzivatelovi:
update mmh_file_storage set počet návštev = počet návštev + 1 where fotka = aktualne_zobrazena_fotky
update mmh_user_info set počet návštev = počet návštev + 1 where uzivatel = vlastnik_aktualne_zobrazenej_fotky
ak tam mas teraz nespravne cisla, tak ich budes musiet natiahnut z tej tabulky ip - s tym ti pomoze script ktory len raz:
princip:
1. zistis vsetkych uzivatelov:
2. cyklus - pra kazdeho uzivatela urob:
2.0. $pocet_zobrazeni_uzivatela = 0
2.1. zisti vsetky fotky
2.2. cyklus - pre kazdu forku urob
2.2.2. $pocet_zobrazeni_fotky = zisti pocet zobrazeni konkretnej fotky z tabulky ip (select count(*)...)
2.2.2. uloz zisteny pocet ku fotke (update ...set pocet = $pocet_zobrazeni_fotky
2.2.3. zvys pocet zobrazeni pre daneho uzivatela o pocet zobrazeni fotky $pocet_zobrazeni_uzivatela+= $pocet_zobrazeni_fotky;
2.2. cyklus - koniec
2.3. uloz zisteny pocet ku uzivatelovi (update ...set pocet = $pocet_zobrazeni_uzivatela
2. cyklus - koniec
Nahlásit jako SPAM
IP: 213.160.186.–To ukladani celkoveho poctu zobrazeni i k uzivateli je urcite krok spravnym smerem, nicmene to prepocitavani by slo resit daleko jednoduseji. Bylo by to zase neco v tom smyslu jak psal bukaj.
Nahlásit jako SPAM
IP: 78.102.164.–To CommanderZ :
Každopádne ide o to, aby sa ten údaj nepočítal stále odznova, ale bol uložený. Pred tým sa tie čísla musia "synchronizovať" a to stačí urobiť iba raz.
Ohľadom algoritmu máš pravdu, šupnúť tú úlohu na mysql to urýchli. Na pochopenie mi však príde jednoduchšie ukázať to na cykloch.
Nahlásit jako SPAM
IP: 213.160.186.–tak jsem na stránku se zobrazením fotky, tzn za část kde se připisují do databáze počty jednotlivých fotek vložil toto :
// zobrazeni je sloupec v tabulce mmh_user_info, ten je nulový
// a do nej se mají připočítat celkové shlédnutí fotek od jednotlivých lidí
// nevím jestli je vhodné to psát takto "mmh_file_storage.gallery_id",
// ale proste to musím porovnat z druhou databází
mysql_query("update mmh_user_info
set zobrazeni = zobrazeni + 1
where user_id = mmh_file_storage.gallery_id ");
no ale i tak pořád nefunguje, hodnota v sloupci zobrazení se nezmení :(
Editoval hrach: čitelnost
Nahlásit jako SPAM
IP: 84.38.187.–Pouzivej velka pismena pro SQL klicova slovam pouzivej enter, pouzivej tabelator...presne jako bukaj. Pak se o tom dotazu muzem pobavit.
Nahlásit jako SPAM
IP: 78.102.164.–To CommanderZ :
proč to mám psát jako on s tabulátory? píšu přímo do php on to psal jako sql příkaz třeba do phpmyadmina. nebo mám tak psat příkazy i do php?
tady to je s velkými písmeny
mysql_query("UPDATE mmh_user_info
SET zobrazeni = zobrazeni + 1
WHERE user_id = '$user' ");
Editoval hrach: čitelnost
Nahlásit jako SPAM
IP: 84.38.187.–baryman
proč to mám psát jako on s tabulátory?
Je to pak přehlednější a dá se s tím líp pracovat, lépe to upravovat apod.
píšu přímo do php on to psal jako sql příkaz třeba do phpmyadmina. nebo mám tak psat příkazy i do php?
Ano, piš jako člověk ;o) U těch jednoduchých dotazů se v tom neztratíš, ale pokud bude nějaký složitější a bude všechno na jednom řádku, blbě se v tom orientuje. Navíc, když to píšeš všechno na jeden řádek, tohle fórum se roztáhne, aby byl vidět celý řádek.
A k tvému problému: Jestli máš přístup k DB, než v aplikaci šaškovat s takovýmto obnovováním, nebylo by nejjednodušší do databáze hodit na tu tabulku zaznamenávající přístupy trigger, který po přidání přepočítá počty přístupů a zapíše je do ostatních tabulek? Vůbec nebudeš muset řešit UPDATy v aplikaci, prostě jenom přidáš do tabulky přístupů řádek a databáze všechno zařídí.
Nahlásit jako SPAM
IP: 85.70.13.–
Zjistit počet nových příspěvků
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa































Uživatelé prohlížející si toto vlákno
Podobná vlákna
Součet hodnot. — založil Luckaa
MySQL - součet hodnot — založil Kouky27
Součet hodnot z cyklu for — založil David
Součet některých hodnot pole — založil anakondatra
Soucet hodnot v podmince vyberu — založil zak
Moderátoři diskuze
TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Newbie

Věrný člen
Boss


