Stránka 1 z 1

Sečtení hodnot v Mysql

Napsal: stř 2. led 2008, 11:08
od Hansz
Zdarec,mám takový problém.V mysql vytvořenou tabulku napr.Tab1 a v ní sloupce
jmeno a pocet např:

jmeno pocet id
AAA 152 1
BBB 100 2
CCC 50 3
AAA 100 4
DDD 400 5
AAA 10 6
CCC 5 7

a potřeboval bych nějak sečíst hodnoty 'pocet' pokud maji stejné 'jmeno'
a ulozit je do jednoho radku pod stejnym jmenem a zbytek vymazat.
vysledek

jmeno pocet id
AAA 262 1
BBB 100 2
CCC 55 3
DDD 400 4

mohli by jste mi prosím poradit jak to udělat.Díky moc.

Napsal: stř 2. led 2008, 12:49
od OndraSter
Predpokladam ze k dispozici mas i PHP. Ja bych to udelal nejak takto:

Kód: Vybrat vše

$result = mysql_query('SELECT * FROM tab1');

$vars = array();

while($line = mysql_fetch_array($result)) {

 if(!$vars[$line['jmeno']]) $vars[$line['jmeno']] = $line['pocet'];
 else $vars[$line['jmeno']] += $line['pocet'];

}

mysql_query('TRUNCATE TABLE tab1');

foreach ($vars as $name=>$number) {

 mysql_query('INSERT INTO tab1 (jmeno, pocet) VALUES (\'' . $name . '\', ' . $number . ')');

}
nezkousel jsem, mozna se tam nekde vyskytuje chyba..

Napsal: stř 2. led 2008, 13:04
od Hansz
No to je problém,já to chci jako součást scriptu (bash) a v tom chci spustit mysql a načíst soubor který se vykoná,takže (jestli to dobře chápu)tak by to mělo být jen z příkazů mysql :x

Napsal: stř 2. led 2008, 13:30
od OndraSter
tak do toho bash skriptu dej i

/usr/bin/php -f /root/soucet.php

:)

Napsal: stř 2. led 2008, 14:05
od Hansz
Tak nakonec jsem to dal dohromady(stacilo poobedvat)

#soucet tech co se vyskytuji vic jak 1 a ulozeni do souboru test_1.txt
select jmeno,sum(pocet) from tab1
group by jmeno having count(*) >=2
into outfile '/home/test_1.txt';

#zapis tech co se vyskytuji jen 1 a ulozeni do souboru test_2.txt
select jmeno,pocet from tab1
group by jmeno having count(*) =1
into outfile '/home/test_2.txt';

+vymazani tab1 a znovu nacteni ze souboru

Mozna krkolomny reseni s tim ukladanim ale s sql si hraji 3 dny tak me potesilo ze jsem na to prisel i sam.Pokud by nekomu vadila rychlost tak to mi nevadi jedna se o malou databazi.

Dik za rady.

Napsal: pon 14. led 2008, 18:05
od Kriss
I prez zdanlivou jedoduchost problemu sem nakonec nad timhle problemem stravil trochu vic casu nez sem chtel, ale vymislel sem ti reseni na 3 radky mysql :)

Kód: Vybrat vše

CREATE TEMPORARY TABLE docasna_tabulka SELECT jmeno, sum(pocet) FROM tab1 GROUP BY jmeno;
TRUNCATE TABLE tab1;
INSERT INTO tab1 SELECT *, NULL FROM docasna_tabulka;
Prvni radek ti vytvori docasnou tabulku kde budou uz vypocitany soucty, druhej radek ti vyprazdni puvodni tabulku a treti radek data z docasny tabulky prekopiruje do puvodni, ted uz prazdny tabulky.
Docasna tabulka se po ukonceni relace sama smaze, takze ji nemusis mazat prikazem.

Edit: btw tohle reseni zabere serveru priblizne setinu doby kterou zabere to reseni s tim ukladanim do souboru :)