« 1 2 »
Autor Zpráva
houbeless
Profil
Zdravim,
potřeboval bych získat SQL dotazem průměr záporných hodnot z posledních 5 záznamů v tabulce, přičemž tyto záznamy nejsou hned zasebou. Příklad, jak bych to řešil, možná jsem už blízko, ale nefunguje to..:

SELECT AVG(zmena) FROM (SELECT zmena WHERE zmena<0 ORDER BY id DESC LIMIT 5) AS nzmena FROM ".tabulka." WHERE idnum='$idnum'");

nebo př.2:

SELECT AVG(SELECT zmena FROM ".tabulka." WHERE idnum='$idnum' AND zmena<0 ORDER BY id DESC LIMIT 5) AS nzmena

Díky za radu
Kajman_
Profil *
SELECT AVG(zmena) FROM (SELECT zmena FROM ".tabulka." WHERE idnum='$idnum' and zmena<0 ORDER BY id DESC LIMIT 5) nzmena
pmg
Profil
Ten první příklad je myšlen dobře, jen pár detailů:
1) ve vnějším dotazu je dvakrát FROM;
2) nejsem si jist, zda je název tabulky definován v konstantě tabulka, nemá tam být proměnná?
2) podmínky je lepší přesouvat do poddotazů.

Oprava?

SELECT AVG(zmena) FROM (SELECT zmena FROM tabulka WHERE zmena<0 and idnum='$idnum' ORDER BY id DESC LIMIT 5) AS nzmena;

Edit: Celkem jsme se shodli, ale doporučuju používat AS, protože si tam jinak člověk snadno dopíše čárku a vede to k chybám.
houbeless
Profil
Díky za rychlou reakci, ale ačkoli to vypadá dobře, tak to nefunguje, zkoušel jsem i AVG(zmena) AS nzmena, tedy dát alias hned za sloupec (jak to má být) a nic.

PS: jmena tabulek jsou samo jen pro ilustraci, s nima problém neni...
Kajman_
Profil *
Nefunguje to nějak konkrétně? (Výpis mysql chyby je kde?)
houbeless
Profil
Dotaz nevrátí žádnou hodnotu. zdá se že problém je v subdotazu.
Ale moje verze MYSQL 5.1 je podporuje.. v jiných případech fungují...
nightfish
Profil
Dotaz nevrátí žádnou hodnotu. zdá se že problém je v subdotazu.
a když spustíš poddotaz samotný, vrátí se nějaké hodnoty? pokud ne, tak zřejmě žádné řádky nevyhovují podmínkám
Kajman_
Profil *
nightfish
Pokud bude poddotaze prázdný, tak stejně vrátí jednu hodnotu v jednom řádku - i když ta hodnota bude prázdná - null.

houbeless
Ukažte okolní kód, kde vypisujete případnou mysql chybu a případný výsledek, třeba za avg stačí dát jen alias.
houbeless
Profil
Tento dotaz vrací průměr všech záporných čísel ( v mém případě z 86 ) z požadovaných idnum:

SELECT AVG(zmena) AS nzmena FROM ".$tabulka." WHERE idnum='$idnum' AND zmena<0

Problém je jak dostat průměr z posledních 5:

protože ORDER BY id DESC LIMIT 5 nefunguje, resp. select vrací pořád průměrnou hodnotu z 86

záznamů, zapsáno takto. Zapsáno subdotazem nevrací nic..

Prostě se neaplikuje ORDER BY a LIMIT oba samostatně testované.
pmg
Profil
Potom by mohl být problém v tom, že máš v tabulce řádky se stejným id, takže i s ORDER BY id DESC LIMIT 5 se vrátí / započítají všechny. Možná zkus tabulku exportovat a někam ji dát, aby se to dalo přímo odzkoušet. Také jsem ty dotazy testoval, ale fungují mi správně. A říkal jsi už, co máš za verzi MySQL?
houbeless
Profil
id = auto incr. to je vždycky jedinečný, ale v případě výběru idnum - není id posloupné ( nejde hned za sebou)

Říkal: ver. 5.1
pmg
Profil
Menší test.

CREATE TABLE tabulka (
zmena int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO tabulka VALUES (-3), (-2), (-1), (1), (2);

SELECT AVG(zmena) FROM (SELECT zmena FROM tabulka WHERE zmena<0 LIMIT 2) AS nzmena;

Vrátí -2,5. Bez limitu -2. Alespoň mně.
houbeless
Profil
Ale jo to funguje, problém byl v použití ORDER BY a podmínky výběru, nakonec jsem to vyladil a má to vypadat takto:

"SELECT AVG(zmena) FROM (SELECT zmena FROM ".$tabulka." WHERE idnum='$idnum' ORDER BY id DESC LIMIT 5) AS zmena WHERE zmena<0"

ta podmínka modify<0 nesmí být uvnitř, protože pak to vrací jen průměr ze posledních 5 záporných hodnot. A mě šlo o průměr záporných hodnot ze všech posledních 5 záznamů.

Co napáchá taková drobnost :)
díky za spolupráci a váš čas.
pmg
Profil
No jo, kdybych si pořádně přečetl první příspěvek... Hlavně, že už to funguje.
houbeless
Profil
Bohužel funguje pouze v phpAdminu, ale ted bych to potřeboval rozchodit v RS United-Nuke, tam se připojuje do db objektem a jsou nějak upravený SQL vrstvy a tento dotaz nefunguje(neprovede se), takže kdyby se našel někdo, kdo zná dobře sql v UN, bylo by to ideální.

PS: ale zjistil jsem, že to nejde ani bez využití objektu, tedy přímym připojením (mysql_connect .. atd), takže problém je jinde - to mi udělalo čáru přes rozpočet ;)
nightfish
Profil
ale zjistil jsem, že to nejde ani bez využití objektu, tedy přímym připojením (mysql_connect .. atd), takže problém je jinde - to mi udělalo čáru přes rozpočet ;)
jak nejde? co napíše echo mysql_error()?
houbeless
Profil
mysql_error nenapíše nic, protože vyhodí php chybu: supplied argument is not a valid MySQL-Link resource in.... zatim jsem se bez toho obešel..udejte pls příklad jeho použití..díky
houbeless
Profil
Tak už jsem to asi zprovoznil: zobrazuji takto: echo mysql_errno() . ": " . mysql_error();

Nicméně výsledek hlášení je 0:
tedy nic..
houbeless
Profil
Tedy shrnutí: chyba se nevypisuje žádná, zdá se že problém je v subselectu.
Najde se někdo, kdo by k tomu byl schopen neco říct?
Kajman_
Profil *
Bez kódu není rady.
DJ Miky
Profil
Zkus ten subselect pustit samostatně, a jestli ti vypíše chybu nebo ne.
houbeless
Profil
Právě, že subselect samostatně funguje...
Já jsem to vyřešil přes php...
Ale chtěl bych vědět v čem je chyba, jestli to má řešení, vyřešit to..
Kajman_
Profil *
Řešení to má. Sám jste psal, že v pma to jde dobře. To, že to neumíte implementovat do Vašeho tajného skriptu, už není otázka databáze.
houbeless
Profil
No tak bych si to řešení rád přečetl.....
Alphard
Profil
No tak bych si to řešení rád přečetl.....
je tohle možné?
Kajman_ to napsal naprosto výstižně
Bez kódu není rady.

buď sem zkopírujete svoje "tajné" scripty a někdo je opraví, nebo buďte rád, že vám to nějak funguje a pořád nevytahujte toto téma
houbeless
Profil
Jako nechápu, co po mě chcete, vždyť jsem Vám to napsal už v prvním příspěvku..
..dobře napíšu použití ve skriptu, jestli to pomůže:

$result =$db->sql_query("SELECT AVG(zmena) FROM (SELECT zmena FROM ".$tabulka." WHERE idnum='$idnum' ORDER BY id DESC LIMIT 5) AS nzmena WHERE zmena<0");

$row = $db->sql_fetchrow($result);
$zmena = $row['nzmena'];
Alphard
Profil
zkuste tohle
$result =$db->sql_query("SELECT AVG(zmena) prumer FROM (SELECT zmena FROM ".$tabulka." WHERE idnum='$idnum' ORDER BY id DESC LIMIT 5) AS nzmena WHERE zmena<0");
$row = $db->sql_fetchrow($result); 
$zmena = $row['prumer'];
houbeless
Profil
Mno tak to nic nevrací, a řekl bych že aj z logiky zápisu SQL to fungovat nemůže..
Alphard
Profil
pro jistotu se zeptám, zapomněl jsem zvýraznit ještě jednu změnu, upravil jste i tohle?
$zmena = $row['prumer'];
houbeless
Profil
ano
« 1 2 »
Toto téma je uzamčeno. Odpověď nelze zaslat.