| Autor | Správa |
baumax
 Užívateľ
 Založený: 11.12.2007 Príspevky: 278
 | Zaslal: Št 15.09.11 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. |
| |
  |
 |
stenley
 Moderátor
 Založený: 27.07.2007 Príspevky: 3776 Bydlisko: Bratislava Vek: 27
 |
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 |
|
_________________ Desktop: CPU: AMD Athlon64 3000+ | MB: Biostar K8T890-A9 | VGA: NVIDIA GeForce 6200 LE 256MB | RAM: 2x 1GB A-DATA DDR 400 MHz Dual Kit | HDD: WD Caviar Blue 320GB | DVD: LG GSA-H10N | Keyboard: Chicony KU-0420 Silver/Black | Mouse: Logitech RX1000 | Zdroj: Corsair CX400 400W | CASE: DELUX DLC-MD370 Black | LCD: 20" Samsung 206BW | Repro: Teac XL-20
Notebook: ACER Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB / Intel HD Graphics | RAM: 4GB DDR3 1066 MHz | HDD: 640GB | |
    |
 |
baumax
 Užívateľ
 Založený: 11.12.2007 Príspevky: 278
 |
datum mam takto: varchar(100) a vyzera presne v takomto formate: 14.09.2011
je to cez datapicker nahodene do tabulky |
| |
  |
 |
stenley
 Moderátor
 Založený: 27.07.2007 Príspevky: 3776 Bydlisko: Bratislava Vek: 27
 |
zvolit horsi format datumu sa uz nedalo?  |
_________________ Desktop: CPU: AMD Athlon64 3000+ | MB: Biostar K8T890-A9 | VGA: NVIDIA GeForce 6200 LE 256MB | RAM: 2x 1GB A-DATA DDR 400 MHz Dual Kit | HDD: WD Caviar Blue 320GB | DVD: LG GSA-H10N | Keyboard: Chicony KU-0420 Silver/Black | Mouse: Logitech RX1000 | Zdroj: Corsair CX400 400W | CASE: DELUX DLC-MD370 Black | LCD: 20" Samsung 206BW | Repro: Teac XL-20
Notebook: ACER Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB / Intel HD Graphics | RAM: 4GB DDR3 1066 MHz | HDD: 640GB | |
    |
 |
baumax
 Užívateľ
 Založený: 11.12.2007 Príspevky: 278
 |
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 |
| |
  |
 |
stenley
 Moderátor
 Založený: 27.07.2007 Príspevky: 3776 Bydlisko: Bratislava Vek: 27
 |
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! |
_________________ Desktop: CPU: AMD Athlon64 3000+ | MB: Biostar K8T890-A9 | VGA: NVIDIA GeForce 6200 LE 256MB | RAM: 2x 1GB A-DATA DDR 400 MHz Dual Kit | HDD: WD Caviar Blue 320GB | DVD: LG GSA-H10N | Keyboard: Chicony KU-0420 Silver/Black | Mouse: Logitech RX1000 | Zdroj: Corsair CX400 400W | CASE: DELUX DLC-MD370 Black | LCD: 20" Samsung 206BW | Repro: Teac XL-20
Notebook: ACER Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB / Intel HD Graphics | RAM: 4GB DDR3 1066 MHz | HDD: 640GB | |
    |
 |
baumax
 Užívateľ
 Založený: 11.12.2007 Príspevky: 278
 |
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 |
| |
  |
 |
stenley
 Moderátor
 Založený: 27.07.2007 Príspevky: 3776 Bydlisko: Bratislava Vek: 27
 |
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... |
_________________ Desktop: CPU: AMD Athlon64 3000+ | MB: Biostar K8T890-A9 | VGA: NVIDIA GeForce 6200 LE 256MB | RAM: 2x 1GB A-DATA DDR 400 MHz Dual Kit | HDD: WD Caviar Blue 320GB | DVD: LG GSA-H10N | Keyboard: Chicony KU-0420 Silver/Black | Mouse: Logitech RX1000 | Zdroj: Corsair CX400 400W | CASE: DELUX DLC-MD370 Black | LCD: 20" Samsung 206BW | Repro: Teac XL-20
Notebook: ACER Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB / Intel HD Graphics | RAM: 4GB DDR3 1066 MHz | HDD: 640GB | |
    |
 |
baumax
 Užívateľ
 Založený: 11.12.2007 Príspevky: 278
 | Zaslal: So 17.09.11 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 |
| |
  |
 |
camo
 Zablokovaný užívateľ
 Založený: 05.09.2009 Príspevky: 1176 Bydlisko: Lehota pod Vtáčnikom
 | Zaslal: So 17.09.11 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... |
| |
    |
 |
baumax
 Užívateľ
 Založený: 11.12.2007 Príspevky: 278
 | Zaslal: So 17.09.11 15:17 |   |
camo: mne to stenley napisal aj s mojim typom, je to OK
poradit nevies s tym problemom, ktory mam aktualne ? |
| |
  |
 |
camo
 Zablokovaný užívateľ
 Založený: 05.09.2009 Príspevky: 1176 Bydlisko: Lehota pod Vtáčnikom
 | Zaslal: So 17.09.11 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. |
| |
    |
 |
baumax
 Užívateľ
 Založený: 11.12.2007 Príspevky: 278
 | Zaslal: So 17.09.11 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  |
| |
  |
 |
camo
 Zablokovaný užívateľ
 Založený: 05.09.2009 Príspevky: 1176 Bydlisko: Lehota pod Vtáčnikom
 | Zaslal: Ne 18.09.11 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útach
Alebo 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; |
|
| |
    |
 |
baumax
 Užívateľ
 Založený: 11.12.2007 Príspevky: 278
 |
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 |
| |
  |
 |
|