Autor | Zpráva | ||
---|---|---|---|
houbeless Profil |
#1 · Zasláno: 10. 8. 2008, 21:59:14
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 * |
#2 · Zasláno: 10. 8. 2008, 22:22:22
SELECT AVG(zmena) FROM (SELECT zmena FROM ".tabulka." WHERE idnum='$idnum' and zmena<0 ORDER BY id DESC LIMIT 5) nzmena
|
||
pmg Profil |
#3 · Zasláno: 10. 8. 2008, 22:27:53 · Upravil/a: pmg
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 |
#4 · Zasláno: 10. 8. 2008, 23:31:10
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 * |
#5 · Zasláno: 10. 8. 2008, 23:49:09
Nefunguje to nějak konkrétně? (Výpis mysql chyby je kde?)
|
||
houbeless Profil |
#6 · Zasláno: 10. 8. 2008, 23:56:36
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 |
#7 · Zasláno: 11. 8. 2008, 08:37:19
„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 |
#9 · Zasláno: 11. 8. 2008, 11:19:30
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 |
#10 · Zasláno: 11. 8. 2008, 11:37:19
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 |
#11 · Zasláno: 11. 8. 2008, 11:47:04
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 |
#12 · Zasláno: 11. 8. 2008, 13:35:48
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 |
#13 · Zasláno: 11. 8. 2008, 15:36:27
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 |
#14 · Zasláno: 11. 8. 2008, 18:05:44
No jo, kdybych si pořádně přečetl první příspěvek... Hlavně, že už to funguje.
|
||
houbeless Profil |
#15 · Zasláno: 11. 8. 2008, 18:29:27
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 |
#16 · Zasláno: 11. 8. 2008, 18:36:13
„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 |
#17 · Zasláno: 11. 8. 2008, 22:42:59
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 |
#18 · Zasláno: 11. 8. 2008, 22:58:42
Tak už jsem to asi zprovoznil: zobrazuji takto: echo mysql_errno() . ": " . mysql_error();
Nicméně výsledek hlášení je 0: tedy nic.. |
||
Časová prodleva: 4 dny
|
|||
houbeless Profil |
#19 · Zasláno: 15. 8. 2008, 21:27:14
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 * |
#20 · Zasláno: 15. 8. 2008, 21:36:33
Bez kódu není rady.
|
||
DJ Miky Profil |
#21 · Zasláno: 15. 8. 2008, 22:07:18
Zkus ten subselect pustit samostatně, a jestli ti vypíše chybu nebo ne.
|
||
houbeless Profil |
#22 · Zasláno: 16. 8. 2008, 00:38:57
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 * |
#23 · Zasláno: 16. 8. 2008, 08:52:59
Ř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 |
#24 · Zasláno: 16. 8. 2008, 12:21:44
No tak bych si to řešení rád přečetl.....
|
||
Alphard Profil |
#25 · Zasláno: 16. 8. 2008, 13:28:10
„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 |
#26 · Zasláno: 16. 8. 2008, 14:27:14
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 |
#27 · Zasláno: 16. 8. 2008, 16:14:22
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 |
#28 · Zasláno: 16. 8. 2008, 18:07:35
Mno tak to nic nevrací, a řekl bych že aj z logiky zápisu SQL to fungovat nemůže..
|
||
Alphard Profil |
#29 · Zasláno: 16. 8. 2008, 18:13:58
pro jistotu se zeptám, zapomněl jsem zvýraznit ještě jednu změnu, upravil jste i tohle?
$zmena = $row['prumer']; |
||
houbeless Profil |
#30 · Zasláno: 16. 8. 2008, 18:27:10
ano
|
||
Téma pokračuje na další straně.
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0