« 1 2 »
Autor Zpráva
Keyjay
Profil
Lidi potřebuju pomoct.
Chci zjistit Max a Min číslo.
Ale čísla přichází z MySQL(tabulek z neznámým počtem) Script zjistí průměr hodnoty "X" z jedné tabulku v pohodě se mi vypíší všechny "X" ale teďka chci zjistit které číslo jen nejmenší a největší přes funkci mysql MIN() a MAX() to jít snad nemůže protože nejde dát "FROM *" šlo by to na určitou tabulku, že ale já bych to chtěl ze všech co v db jsou.

Zkoušel jsem udělat vlastní script co by to zjistil, ale tohle mi nějak nevyšlo moje znalosti z jazyka C se nějak nefungují v PHP.
Díky moc všem za rady !
Tomášeek
Profil
Někde děláš chybu, a sice, ze tato data mji byt v jedne tabulce, nikoliv ve vice. Dej ta data do jedne tabulky, pak nad nimi bude fungovat min a max.
Keyjay
Profil
Tomášeek:
Nejde to dát do jedné :/ to je právě to ty data se furt mění.. jde vlastně o nejlépe a nejhůře hodnocený příspěvek (to hodnocení se mění)
pcmanik
Profil
Keyjay:
Ako vyzerajú tvoje tabuľky? Na hodnotenie príspevkov budeš mať tabuľku niečo ako id, id_prispevku, hodnotenie nie? V tom prípade nevidím problém s MIN a MAX
Keyjay
Profil
pcmanik:
To sice ano, ale to by šlo zjistit pouze z jedné tabulky (1 tabulka = 1 příspěvek) ale já chci (X tabulek = X příspěvků)


Odkaz na "schéma" jak by to mělo fungovat a co funguje data.kbhndesign.cz/pomoc.jpg
TomášK
Profil
Keyjay
ale já chci (X tabulek = X příspěvků)

Nechceš. Nanejvýš si myslíš, že to chceš, ale ve skutečnosti ne, protože to přidělá spoustu problémů. Změň to na 1 tabulka = X příspěvků. Pokud je problém to změnit, napiš jaký, pokusíme se ho vyřešit.
Keyjay
Profil
Nelze to dát do jedné tabulky..
Pokud admin vytvoří "nový příspěvek"(vytvoří se i tabulka) uživatelé ho můžou "komentovat" a dávat hodnocení. To hodnocení se uloží do mysql. Do dané tabulky od určítého příspěvku a tedka ja chci aby se mi zobrazily třeba ty nejlépe hodnocené příspěvky ze všechny tabulek. Viz. data.kbhndesign.cz/pomoc.jpg
TomášK
Profil
Pokud admin vytvoří "nový příspěvek"(vytvoří se i tabulka)
To je špatně. Má existovat jedna tabulka s příspěvky a při vytvoření nového příspěvku se do ní přidat jen jeden řádek. Proč má každý příspěvek svou tabulku?
Keyjay
Profil
protože bych nikdy nezjistil AVG jednoho příspěvku ale AVG celé stránky. Viz ten obrázek..
Taky jsem to chtěl udělat do jedné tabulky ale nejde to tak :/ bylo by tam strašně moc podmínek a takhle je to jednodušší
TomášK
Profil
protože bych nikdy nezjistil AVG jednoho příspěvku ale AVG celé stránky.
Hodnocení stránky:
SELECT AVG(hodnoceni) FROM t

Hodnocení příspěvku:
SELECT AVG(hodnoceni) FROM t WHERE prispevek_id = 1

Hodnocení všech příspěvků:
SELECT prispevek_id, AVG(hodnoceni) FROM t GROUP BY prispevek_id

Pokud trváš na struktuře, jakou máš, vytáhni si průměr z každé tabulky a udělej minimum až v aplikaci (php), nic lepšího neuděláš. Až tam budeš mít 1000 příspěvků, budeš to stejně muset změnit, protože to bude příliš pomalé.
pcmanik
Profil
Keyjay:
Takto je to komplikovanejšie a nesprávne, preto nevieš určit min a max... Naštuduj si prosím ako sa pracuje s databázami.
Keyjay
Profil
no dobře ale to jsem tak kde jsem tedka ta aplikace v PHP mi nejde...............
Ok je to taky možnost ale mi nic nepomůže..
pcmanik
Profil
Keyjay:
No bohužial keďže si si vymyslel zlé riešenie, že pre každý príspevok máš jednu tabuľku tak hold môžeš to od začiatku prekopať.

Jedna tabuľka na príspevky a jedna tabuľka na komentáre resp. hodnotenia ktoré budú spolu prepojené.
Keyjay
Profil
ok řekneme, že ano... jak pak tedy udělám script na určení MIN a MAX?.
Rfilip
Profil
Tak jak to psal TomášK v [#10] jen nahradíš AVG za MIN či MAX
Keyjay
Profil
dobře ještě jednou... Chci ze všech AVG udělat to které je Největší nebo Nejmenší..
TomášK.
Profil *
SELECT
  MIN(prumer),
  MAX(prumer) 
FROM (
    SELECT 
      AVG(hodnoceni) prumer
     FROM t
  ) AS prumery
Keyjay
Profil
v php by to nešlo? :/
juriad_
Profil *
TomášK.:
Ne. To fungiovat nebude.

Zkusím to popsat postupně. V databázi jsou dvě tabulky:
tabulka hodnoceni (id, id_uzivatel, id_prispevku, hodnota)
tabulka prispevky (id, id_uzivatel, text)

SELECT id_prispevku, AVG(hodnota) prumer
FROM hodnoceni
GROUP BY id_prispevku
Vrátí dva sloupce: id_prispevku a jeho průměrné hodnocení (pokud příspěvek nebyl hodnocen, není vrácen)

SELECT MIN(prumer) nejhorsi, MAX(prumer) nejlepsi
FROM (
  SELECT id_prispevku, AVG(hodnota) prumer
  FROM hodnoceni
  GROUP BY id_prispevku
) p
Vrátí jeden řádek s minimálním a maximálním průměrným hodnocením.

SELECT id_prispevku, prumer
FROM (
  SELECT id_prispevku, AVG(hodnota) prumer
  FROM hodnoceni
  GROUP BY id_prispevku
) p
JOIN (
  SELECT MIN(prumer) nejhorsi, MAX(prumer) nejlepsi
  FROM (
    SELECT id_prispevku, AVG(hodnota) prumer
    FROM hodnoceni
    GROUP BY id_prispevku
  ) p
) q ON p.prumer = q.nejhorsi OR p.prumer = q.nejlepsi
Vrátí id_prispevku a jeho průměrné hodnocení, ale jen ty, jejichž průměr je nejhorší nebo nejlepší. Pozor toto vrátí všechny příspěvky, které mají dané hodnocení, může jich být spoustu.

Výpis přímo příspěvků (nejlepších a nejhorších) spočívá v přidání jednoho JOINu nakonec:
JOIN prispevky r ON p.id_prispevku = r.id

Pokud ještě nebyl hodnocen žádný příspěvek, tak první dotaz nevrátí nic, a tedy ani druhý a třetí.
Pokud mají všechny příspěvky shodné průměrné hodnocení, tak minimum = maximum a poslení dotaz tedy vrátí všechny hodnocené příspěvky.
Keyjay
Profil
Super tohle vypadá lépe, ale bude to fungovat s neznámým počtem tabulek ? že bych dal FROM $a ($a v cyklu by to byla cesta k tabulce)
pcmanik
Profil
Keyjay:
Pochop už prosím že tvoje riešenie s viacerými tabuľkami je totálne zlé. Juriad ti na začiatku jeho príspevku uviedol akú štruktúru majú mať 2 tabuľky.
Keyjay
Profil
pcmanik:
No vlastně funguje na principu dvou tabulek, stím že je jedna "statická" kde se ukládají nazvý tech dalších vygenerovaných tabulek.
Proč by to nešlo použít jak: Juriad ? Nebo proč na to nejde použít PHP SCRIPT. Tak aby se to neřešilo přes SQL.
Tomášeek
Profil
Keyjay:
Na začátku jsem psal, že děláš chybu. Od té doby to tu je zopakované cca 10krát, ale ty pořád meleš to svoje. To už je dobré peklo :-)

Žádná statická a hafo dynamických tabulek nepotřebuješ, to je nesmysl. Rozházej si data do tabulek podle juriada, dokud tam těch dat je pár. Je to jediné správné řešení.

Pokud potřebuješ za běhu aplikace přidávat sloupce do některé z tabulek, nebo nedej bože celé tabulky (navíc se shodnou strukturou, jednu jako druhou), je špatně návrh aplikace, s kterým se nedá dále pracovat, což snad vidíš i při takových banalitách.
juriad
Profil
Keyjay:
Protože SQL dotaz vždy musí mít pevný počet tabulek. Jakékoli řešení, které používá dynamický počet tabulek je špatně.
Ano, vždy to můžeš zpracovat v PHP, ale bude to znamenat položit tisíce dotazů do databáze. Nedělá se to tak z dobrého důvodu, a těch důvodů jsou spousty. Právě jsi narazil na první. Dokážeš si představit dotaz, který vrací 10 posledních hodnocení pro každého uživatele?
Keyjay
Profil
Takže řešení to naházet do jedné tabulky ? :D
Keyjay
Profil
Ok lidi, mám to předělané na dvě tabulky, jedno na příspěvky a jedno na hodnocení, jak tedy udělat tedka vlastně MIN(AVG(score)) ?
Keeehi
Profil
[#19]
Keyjay
Profil
ok tohle hodím do cyklů v php ale jako vytisknu daný příspěvek, který je nejhorší/lepší ? :O row[???].
Díky
pcmanik
Profil
Keyjay:
Druhý select v [#19] vracia jeden riadok s dvomi stĺpcami tak hádam si ich vieš vypísať. Ak chceš lepšie poradiť ukáž kód.
Keyjay
Profil
Fungujete až do doby když zadám JOIN, "#1052 - Column 'id' in field list is ambiguous" :(
SELECT id, prumer FROM ( SELECT id, AVG(s) prumer FROM hodnoceni GROUP BY id) p JOIN ( SELECT MIN(prumer) nejhorsi, MAX(prumer) nejlepsi FROM ( SELECT id, AVG(s) prumer FROM hodnoceni GROUP BY id) p ) q ON p.prumer = q.nejhorsi OR p.prumer = q.nejlepsi JOIN op_add r ON p.id = r.id;
« 1 2 »

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:

0