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
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
?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
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.
To baryman : no tak je tak slozite kdyz zvysujes counter u fotky zvysit take counter u uzivatele???
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 :(
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ť...
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...
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
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.
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.
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
Pouzivej velka pismena pro SQL klicova slovam pouzivej enter, pouzivej tabelator...presne jako bukaj. Pak se o tom dotazu muzem pobavit.
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
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í.
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