Autor | Zpráva | ||
---|---|---|---|
Keyjay Profil |
#1 · Zasláno: 29. 11. 2016, 16:04:54
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 |
#2 · Zasláno: 29. 11. 2016, 16:08:26
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 |
#3 · Zasláno: 29. 11. 2016, 16:15:50
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 |
#4 · Zasláno: 29. 11. 2016, 16:24:31
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 |
#6 · Zasláno: 29. 11. 2016, 16:50:06
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 |
#7 · Zasláno: 29. 11. 2016, 16:54:14
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 |
#8 · Zasláno: 29. 11. 2016, 16:57:05
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 |
#9 · Zasláno: 29. 11. 2016, 17:00:01
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 |
#11 · Zasláno: 29. 11. 2016, 17:18:17
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 |
#12 · Zasláno: 29. 11. 2016, 17:19:19
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 |
#14 · Zasláno: 29. 11. 2016, 17:25:22
ok řekneme, že ano... jak pak tedy udělám script na určení MIN a MAX?.
|
||
Rfilip Profil |
#15 · Zasláno: 29. 11. 2016, 17:31:07
Tak jak to psal TomášK v [#10] jen nahradíš AVG za MIN či MAX
|
||
Keyjay Profil |
#16 · Zasláno: 29. 11. 2016, 17:32:07
dobře ještě jednou... Chci ze všech AVG udělat to které je Největší nebo Nejmenší..
|
||
TomášK. Profil * |
#17 · Zasláno: 29. 11. 2016, 17:36:18
SELECT MIN(prumer), MAX(prumer) FROM ( SELECT AVG(hodnoceni) prumer FROM t ) AS prumery |
||
Keyjay Profil |
v php by to nešlo? :/
|
||
juriad_ Profil * |
#19 · Zasláno: 29. 11. 2016, 18:27:52
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 SELECT MIN(prumer) nejhorsi, MAX(prumer) nejlepsi FROM ( SELECT id_prispevku, AVG(hodnota) prumer FROM hodnoceni GROUP BY id_prispevku ) p 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 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 |
#20 · Zasláno: 29. 11. 2016, 18:39:06
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 |
#21 · Zasláno: 29. 11. 2016, 18:45:38
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 |
#23 · Zasláno: 29. 11. 2016, 19:32:49
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 |
#24 · Zasláno: 29. 11. 2016, 19:45:32
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 |
#25 · Zasláno: 29. 11. 2016, 20:11:33
Takže řešení to naházet do jedné tabulky ? :D
|
||
Keyjay Profil |
#26 · Zasláno: 30. 11. 2016, 16:30:03
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 |
#27 · Zasláno: 30. 11. 2016, 17:32:38
[#19]
|
||
Časová prodleva: 3 dny
|
|||
Keyjay Profil |
#28 · Zasláno: 3. 12. 2016, 23:45:10
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 |
#29 · Zasláno: 4. 12. 2016, 00:01:50
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. |
||
Časová prodleva: 10 dní
|
|||
Keyjay Profil |
#30 · Zasláno: 13. 12. 2016, 23:29:46
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; |
||
Téma pokračuje na další straně.
|
0