| | |
| Stránka: 1 z 1
| [ Príspevkov: 20 ] | |
Autor | Správa |
---|
Registrovaný: 11.12.07 Prihlásený: 12.02.24 Príspevky: 487 Témy: 138 Bydlisko: Bytča | Napísal baumax: 15.09.2011 22:10 | |
|
Mam takyto select z tabulky, t.j. zoradim si ludi podla priemernej hodnoty v stlpci prispevok
Kód: $xyz = "SELECT nick_name, avg(prispevok) FROM prispevky_table group by nick_name ORDER by avg(prispevok) DESC "; $vysledok = mysql_query($xyz) or die ("Stala sa chyba v spojeni s DB");
Tabulka je plna zaznamov a mam v kazdom zazname aj datum, v ktorom dany nick_name pridal zaznam do databazy.
Potrebujem select, ktory mi z tabulky vyberie a zoradi ludi podla avg(prispevok), ktori za poslednych 6 mesiacov vlozili minimalne 60 zaznamov. (urcite to bude maly pocet z celkoveho poctu prispievatelov)
V stlpci prispevok je cislo typu float, ktore moze byt od 0 po 10, aj desatinne.
Dakujem.
|
|
Registrovaný: 27.07.07 Príspevky: 3948 Témy: 51 Bydlisko: Bratislava |
skus pouzit having - neviem, v akom formate mas datum, takze zatial takto:
Kód: SELECT nick_name, AVG(prispevok), count(*) pocet FROM prispevky_table WHERE datum >= SUBDATE(NOW(), INTERVAL 6 MONTH) GROUP BY nick_name HAVING pocet >= 60 ORDER BY AVG(prispevok) DESC
_________________ NTB: Acer Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB | RAM: 8GB DDR3 1066 MHz | HDD: 1TB SSD WD BLUE |
|
Registrovaný: 11.12.07 Prihlásený: 12.02.24 Príspevky: 487 Témy: 138 Bydlisko: Bytča | Napísal autor témy baumax: 16.09.2011 8:15 | |
|
datum mam takto: varchar(100) a vyzera presne v takomto formate: 14.09.2011
je to cez datapicker nahodene do tabulky
|
|
Registrovaný: 27.07.07 Príspevky: 3948 Témy: 51 Bydlisko: Bratislava |
zvolit horsi format datumu sa uz nedalo?
_________________ NTB: Acer Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB | RAM: 8GB DDR3 1066 MHz | HDD: 1TB SSD WD BLUE |
|
Registrovaný: 11.12.07 Prihlásený: 12.02.24 Príspevky: 487 Témy: 138 Bydlisko: Bytča | Napísal autor témy baumax: 16.09.2011 8:31 | |
|
ono ja to mam tak, ze
if (empty($mesiac)) $mesiac = date('n');
if (empty($rok)) $rok = date('Y');
a potom selecty koncia:
datum LIKE '%$mesiac.$rok'"; - ked hladam pre dany rok
datum LIKE '%$rok'"; - ked hladam pre dany mesiac
takze nejako to treba spojit do kopy nie ? ehm
|
|
Registrovaný: 27.07.07 Príspevky: 3948 Témy: 51 Bydlisko: Bratislava |
mozno toto pomoze, aj ked funkcia na lavej strane by sa pouzivat nemala:
Kód: WHERE STR_TO_DATE(datum, '%d.%m.%Y') >= SUBDATE(CURDATE(), INTERVAL 6 MONTH)
Do buducna, nauc sa pouzivat typy stlpcov urcene pre casove udaje!
_________________ NTB: Acer Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB | RAM: 8GB DDR3 1066 MHz | HDD: 1TB SSD WD BLUE |
|
Registrovaný: 11.12.07 Prihlásený: 12.02.24 Príspevky: 487 Témy: 138 Bydlisko: Bytča | Napísal autor témy baumax: 16.09.2011 8:42 | |
|
a kebyze to spravim nejako tak, ze cely stlpec zmenim na format DATE ? nepomohlo by to ?
ta transformacia myslim by s udajmi dnu nemala nic spravit, ci ano ?
ptom by to nebolo lahsie ?
dik
|
|
Registrovaný: 27.07.07 Príspevky: 3948 Témy: 51 Bydlisko: Bratislava |
ked zmenis cisto len typ stlpca na date, hodnoty ti automaticky zmeni, len nie tak, ako by si si mozno prial - napriklad z datumu 14.09.2011 ti spravi 2014-09-20
ale nic ti nebrani v tom, aby si vykonal jeden update (upravis format datumu), zmenil typ stlpca a upravil svoj php kod...
_________________ NTB: Acer Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB | RAM: 8GB DDR3 1066 MHz | HDD: 1TB SSD WD BLUE |
|
Registrovaný: 11.12.07 Prihlásený: 12.02.24 Príspevky: 487 Témy: 138 Bydlisko: Bytča | Napísal autor témy baumax: 17.09.2011 12:18 | |
|
dakujem ...
ale mam tu problem ...
proste teraz spravi toto: vypise tych ludi, pocet je OK, ale zoradi ich zle, lebo ich zoradi podla avg(prispevok) za ten interval 6 mesiacov - potrebujem zoradenie podla avg(prispevok) celkove
ako na to ? nejakym vnorenym SELECTOM ? a ten dnu bude to co si napisal a ten vonkajsi bude order by avg(prispevok) ale nebude obmedzeny tym casovym intervalom ... alebo nieco podobne ?
P.S. s tym datumom sorry, viem, ze som tam mal dat typ: date
|
|
Registrovaný: 05.09.09 Príspevky: 1141 Témy: 127 Bydlisko: Lehota pod ... | Napísal camo: 17.09.2011 15:05 | |
|
Ten typ stĺpca budeš musieť zmeniť. Dátumové funkcie potrebujú pre fungovanie správny typ.
Až potom má zmysel riešiť to radenie....
Takže najprv update na správny formát dátumu a potom change column na správny typ...
|
|
Registrovaný: 11.12.07 Prihlásený: 12.02.24 Príspevky: 487 Témy: 138 Bydlisko: Bytča | Napísal autor témy baumax: 17.09.2011 15:17 | |
|
camo: mne to stenley napisal aj s mojim typom, je to OK
poradit nevies s tym problemom, ktory mam aktualne ?
|
|
Registrovaný: 05.09.09 Príspevky: 1141 Témy: 127 Bydlisko: Lehota pod ... | Napísal camo: 17.09.2011 15:38 | |
|
Aktuálne máš problém s typom mimo iné...
A napísal ti Stenley ako zmeniť typ stĺpca, alebo si tým myslel toto:
Kód: WHERE STR_TO_DATE(datum, '%d.%m.%Y') >= SUBDATE(CURDATE(), INTERVAL 6 MONTH)
Stenley ti tu dokola píše, že ten typ je nanič a bolo by ho treba zmeniť.
Tú funkciu STR_TO_DATE(datum, '%d.m%.%Y') použi v update.
|
|
Registrovaný: 11.12.07 Prihlásený: 12.02.24 Príspevky: 487 Témy: 138 Bydlisko: Bytča | Napísal autor témy baumax: 17.09.2011 16:17 | |
|
camo: prosim ta, neries, co je vyriesene. Ved sa ta slusne pytam, ci mi nevies pomoct s tym triedenim podla avg(prispevok) ale nie za poslednych 60 dni, ale celkovo, ved som to tu jasne myslim napisal.
problem s typom NEMAM, neviem ako Ti to este mam napisat inak
|
|
Registrovaný: 05.09.09 Príspevky: 1141 Témy: 127 Bydlisko: Lehota pod ... | Napísal camo: 18.09.2011 11:16 | |
|
Myslím, že tá podmienka na tých 60 záznamov má byť v having. Ale či sa nemýlim neviem. Netestoval som to.
Kód: SELECT nick_name, AVG(prispevok), count(*) pocet FROM prispevky_table GROUP BY nick_name HAVING (select count(*) as pocet from prispevky_table group by nick_name where pocet > 60 and datum >= SUBDATE(NOW(), INTERVAL 6 MONTH)) ORDER BY AVG(prispevok) DESC
Na viac sa asi nezmôžem... A som presvedčený, že máš problém s typom stĺpca! EDIT: po 15 hodinách 53 minútachAlebo skôr takto: Kód: select nick_name, avg(prispevok), count(*) from prispevky_table t1 join (select nick_name meno2, count(*) pocet from prispevky_table where prispevky_table.datum >= SUBDATE(NOW(), INTERVAL 6 MONTH) group by meno2 having pocet>60) t2 on t1.nick_name=t2.meno2;
|
|
Registrovaný: 11.12.07 Prihlásený: 12.02.24 Príspevky: 487 Témy: 138 Bydlisko: Bytča | Napísal autor témy baumax: 19.09.2011 9:34 | |
|
camo, ten zapis posledny asi nebude dobry, pise mi chybu, zly syntax
ja som to zapisal takto podla teba: Kód: $poziadavkaOK2 = "SELECT nick_name, AVG(prispevok), count(*) FROM prispevky_table t1 join (SELECT nick_name meno2, count(*) pocet from prispevky_table WHERE STR_TO_DATE(cas, '%d.%m.%Y') >= SUBDATE(NOW(), INTERVAL 6 MONTH) group by meno2 having pocet >= 60) t2 on t1.nick_name=t2.meno2)";
$resultOK2 = mysql_query($poziadavkaOK2) or die ("Stala sa chyba v spojeni s DB");
v phpmyadmin: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')
LIMIT 0, 60' at line 1
stenley, poradis ty ? hore som pisal, kde mam problem s tym tvojim zapisom
|
|
Registrovaný: 05.09.09 Príspevky: 1141 Témy: 127 Bydlisko: Lehota pod ... | Napísal camo: 19.09.2011 13:35 | |
|
Neviem kde sa tam bere ten limit. Nič také tam nemám. A zdá sa, že PhpMyAdmin má hlášky navlas rovnaké ako konzola, tak to skúšaj radšej tam. Je to rýchlejšie
Mne tá logika fungovala. Priemer z celkového príspevku a len tie ktoré mali počet za posledné obdobie väčší ako dané číslo. Ja som robil ale s číslami nie s dátumami a už vonkoncom som to nekonvertoval za jazdy...
EDIT:
Tá zátvorka na konci nemá byť! Neviem ako sa mi tam dostala...
|
|
Registrovaný: 11.12.07 Prihlásený: 12.02.24 Príspevky: 487 Témy: 138 Bydlisko: Bytča | Napísal autor témy baumax: 19.09.2011 14:16 | |
|
limit vychadza asi z toho having pocet >= 60
dal som prec zatvorku: :> #1140 - Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
|
|
Registrovaný: 27.07.07 Príspevky: 3948 Témy: 51 Bydlisko: Bratislava |
skus toto:
Kód: SELECT a.nick_name, AVG(prispevok) priemer FROM prispevky_table a INNER JOIN ( SELECT nick_name, count(*) pocet FROM prispevky_table WHERE STR_TO_DATE(datum, '%d.%m.%Y') >= SUBDATE(CURDATE() , INTERVAL 6 MONTH) GROUP BY nick_name HAVING pocet >=60 ) b USING(nick_name) GROUP BY a.nick_name ORDER BY priemer DESC
_________________ NTB: Acer Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB | RAM: 8GB DDR3 1066 MHz | HDD: 1TB SSD WD BLUE |
|
Registrovaný: 05.09.09 Príspevky: 1141 Témy: 127 Bydlisko: Lehota pod ... | Napísal camo: 19.09.2011 15:38 | |
|
Len tak pre istotu sa spýtam, aká je to verzia Mysql.
Lebo count(*) by mala pracovať aj bez group by.
|
|
Registrovaný: 11.12.07 Prihlásený: 12.02.24 Príspevky: 487 Témy: 138 Bydlisko: Bytča | Napísal autor témy baumax: 19.09.2011 15:58 | |
|
stenley, vyzera, ze je to OK, vdaka, este to skontrolujem .... ale asi hej, dalo tych istych ludi, ako predtym a spravne zoradilo (teda podla celkoveho priemeru) a vybralo pekne len ludi podla podmienky minimalneho poctu 60 za poslednych 6 mesiacov // pridané po 12 minútach od posledného príspevkucamo píše: Len tak pre istotu sa spýtam, aká je to verzia Mysql. Lebo count(*) by mala pracovať aj bez group by.
Verzia MySQL klienta: 5.0.51a
|
|
| Stránka: 1 z 1
| [ Príspevkov: 20 ] | |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|