« 1 2 »
Autor Zpráva
Stepanka
Profil *
Ahoj,

potřebovala bych poradit ohledně jednoho dotazu na db.
Vlastně se to týká jen jedné tabulky..
Radši sem zkopíruju obsah, vlastními slovy by to bylo těžké, takže tabulka vypadá takto:

CREATE TABLE IF NOT EXISTS `mantis_custom_field_string_table` (
  `field_id` int(3) NOT NULL default '0',
  `bug_id` int(7) NOT NULL default '0',
  `value` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`field_id`,`bug_id`),
  KEY `bug_id` (`bug_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin2;

--
-- Vypisuji data pro tabulku `mantis_custom_field_string_table`
--

INSERT INTO `mantis_custom_field_string_table` (`field_id`, `bug_id`, `value`) VALUES
(2, 1, '3'),
(8, 1, 'ANO'),
(10, 1, '600'),
(2, 3, ''),
(8, 3, 'NE'),
(10, 3, ''),
(2, 4, '1,5'),
(8, 4, 'NE'),
(10, 4, ''),
(2, 5, '0,5'),
(8, 5, 'NE'),
(10, 5, '200'),
(2, 6, '2');
(8, 6, 'NE'),
(10, 6, '800'),
(2, 7, ''),
(8, 7, 'NE'),
(10, 7, ''),
(2, 10, '2'),
(8, 10, 'NE'),
(10, 10, ''),


Ihned samozřejmě vysvětlím..
Na prvním místě "field_id" se vyskytuje hodnota -> Pokud je tam "2", jde o odpracovaný čas v hodinách. Pokud je tam "8", jde o hodnotu ANO/NE (zda byl projekt již zaplacen řešiteli). Pokud je tam hodnota "10", jde o částku k zaplacení za projekt.

Na druhém místě "bug_id" je číslo projektu, je zde jen 7 projektů.

A na třetím místě "value" je samozřejmě daná hodnota vztahující se k "field_id".

A teď bych potřebovala stvořit jeden SELECT, který:
- vybere čísla ze třetího sloupce "value".
- Ty čísla musí být v řádku, kde je "field_id" rovno 2 (Tzn. musí to být hodnota odpracovaného času, ne částky k zaplacení)
- Ty čísla (ten daný počet hodin) musím vzít jen od těch problémů, které nejsou zaplacené, tudíž mají na řádku field_id hodnotu "8" a zároveň na řádku value hodnotu "NE".

Čili v tomto případě bych potřebovala nějaký SELECT, který mi vybere pouze řádky:
(2, 3, ''),
(2, 4, '1,5'),
(2, 5, '0,5'),
(2, 6, '2');
(2, 7, ''),
(2, 10, '2'),

A z těch řádků jen hodnoty '', '1,5', '0,5', '2', '', '2'.
Ty prázdné čísla mi tam nevadí, pak všechny tyhle čísla sčítám, takže prázdné číslo přidá k výsledku akorát nulu, tudíž tohle se řešit nemusí.

A teď ta nejdůležitější otázka - jde takový příšerný SELECT vůbec stvořit?
Jestli ano, budu moc ráda, když mi někdo pomůže.

Děkuju!
joe
Profil
Zkusil jsem toto a funguje:-)

SELECT org.value FROM
mantis_custom_field_string_table org

INNER JOIN
mantis_custom_field_string_table cpy
ON
cpy.bug_id = org.bug_id AND cpy.field_id = 8 AND cpy.value = 'NE'

WHERE org.field_id = 2
Stepanka
Profil *
joe
No teda, fakt :-) Funguje :-) Děkuju moc!
Btw.. závidím, že umíš stvořit takový ošklivý dotaz... klobouk dolů. Díky!
Stepanka
Profil *
A šlo by ještě z toho SELECTU vytáhnout to, aby zobrazoval i ty částky k zaplacení?
To znamená, aby to vypsalo ty údaje, které to vypisuje teď + za každým údajem o hodinách vypsat finanční částku. Stačí "vytáhnout", vypisovat se to nemusí, vypisuje se až součet.

Ten kód vypadá takhle:

$query = "SELECT org.value FROM
					mantis_custom_field_string_table org
					INNER JOIN
					mantis_custom_field_string_table cpy
					ON
					cpy.bug_id = org.bug_id 
					AND cpy.field_id = 8 
					AND cpy.value = 'NE'
					WHERE org.field_id = 2";
		$soucet = 0;
		for ($t_result = db_query($query); !$t_result->EOF; $t_result->MoveNext() ) {
			$soucet += (float)str_replace(",",".",$t_result->fields['value']);
		}
		$soucet = str_replace(".",",",$soucet);
		return " <span style=\"color:red;font-family:Courier;\">[celkem -> ".$soucet ." hod]</span>";


Potřebovala bych, aby za tim celkem -> ".$soucet ." hod bylo ještě "Celkem: xxx Kč".
Jen to jaksi neumím vytáhnout z db..

Děkuju.
Alphard
Profil
co tohle?
SELECT
case when org.field_id=2 then org.value else '' end as 'cas',
case when org.field_id=10 then org.value else '' end as 'castka'
FROM
mantis_custom_field_string_table org
INNER JOIN
mantis_custom_field_string_table cpy
ON
cpy.bug_id = org.bug_id 
AND cpy.field_id = 8 
AND cpy.value = 'NE'
WHERE org.field_id = 10 or org.field_id = 2


není to úplně ideální, protože to nevrátí údaje srovnané na jeden projekt 2 čísla (každé je na novém řádku), ale pro počítání součtu by to nemuselo vadit
výsledek vypadá nějak takhle

mysql> SELECT
    -> case when org.field_id=2 then org.value else '' end as 'cas',
    -> case when org.field_id=10 then org.value else '' end as 'castka'
    -> FROM
    -> mantis_custom_field_string_table org
    -> INNER JOIN
    -> mantis_custom_field_string_table cpy
    -> ON
    -> cpy.bug_id = org.bug_id
    -> AND cpy.field_id = 8
    -> AND cpy.value = 'NE'
    -> WHERE org.field_id = 10 or org.field_id = 2;
+-----+--------+
| cas | castka |
+-----+--------+
|     |        |
|     |        |
| 1,5 |        |
|     |        |
| 0,5 |        |
|     | 200    |
| 2   |        |
|     | 800    |
|     |        |
|     |        |
| 2   |        |
|     |        |
+-----+--------+
12 rows in set (0.00 sec)


PS: nabízí se funkce sum(), ale nevím, jak by si poradila se sčítáním desetinných čísel v textovém poli, možná by stálo za úvahu sloupec value definovat jako číselný, hodnty ano / ne by mohly být reprezentovány jako 1 / 0, vše by se zjednodušilo
Kajman_
Profil *
Nebo to vysčítat rovnou v dotaze... ale fakt je, že dávat čísla do varcharu a ještě s českou čárkou je divnost.

select field_id, sum(replace(value, ',', '.')) soucet
from   mantis_custom_field_string_table
where  field_id in (2, 10)
       and bug_id in (select bug_id
                      from   mantis_custom_field_string_table
                      where  field_id = 8
                             and value = 'NE')
group  by field_id
order  by field_id
ninja
Profil
Stepanka: Co vas vedlo k tomuto navrhu a pouziti atributove databaze? Proc to neni (bug_id , workedhours, paid, cost)? Vzdy kazdy bug stejne ma minimale 2 hodnoty.
Stepanka
Profil *
Kajman_
Asi to je divnost, ale je to databáze vcelku rozšířeného systému Mantis. Já osobně bych to asi taky řešila jinak.

Jinak moc děkuji za radu. Když potom vypíšu
$result = db_query($query);	
		$row = db_fetch_array($result);
		echo $row['soucet'];

Vyhodí mi to správné číslo, čili 6.
Ale součet těch částek tam nikde nevidím. Mohla bych teď napsat něco jako echo $row['xxx'];, aby mi to vypsalo i sumu peněz? (to znamená nějakých 1600,-)

Děkuju.
Stepanka
Profil *
Alphard
Taky moc děkuju za radu.
Zkoušela jsem to, ale v tomhle dotazu se moc nevyznám a nevím jak potom vypsat ty proměnné těch součtů.
Jinak vlastně vůbec nevadí, že nejsou ty dvě čísla na jednom řádku. Tady by problém být neměl.

Mohl bys, prosím, ten kód doplnit o nějaký zbytek? Nerozumím tady těm dvoum řádkům
case when org.field_id=2 then org.value else '' end as 'cas',
case when org.field_id=10 then org.value else '' end as 'castka'

takže zatím moc nerozumím tomu, jak to z té db taháš.

děkuji!
Stepanka
Profil *
ninja
No tak by to bylo určitě lepší. Já ale bohužel strukturu databáze měnit nemůžu. Musím pracovat s tím, co mám.
Stepanka
Profil *
Alphard
Jo aha, už je mi to jasné.
Jo, díky moc, to by určitě šlo použít ;)
Alphard
Profil
Stepanka
vysvětlovat těžko, je to pokročilé, jedině studovat... http://www.linuxsoft.cz/article.php?id_article=933
ale ten dotaz je kompletní, stejně jako ten od kajmana, který vrátí
mysql> select field_id, sum(replace(value, ',', '.')) soucet
    -> from   mantis_custom_field_string_table
    -> where  field_id in (2, 10)
    ->        and bug_id in (select bug_id
    ->                       from   mantis_custom_field_string_table
    ->                       where  field_id = 8
    ->                              and value = 'ne')
    -> group  by field_id
    -> order  by field_id;
+----------+--------+
| field_id | soucet |
+----------+--------+
|        2 |      6 |
|       10 |   1000 |
+----------+--------+
2 rows in set (0.00 sec)


viděl bych to na chybu při zpracování, zřejmě se nedostanete dále než k 1. řádku vrácené sady
Stepanka
Profil *
Všem vám moc děkuju, moc mi to pomohlo.
Díky!
Stepanka
Profil *
Ehm ... a součet prvků v tom poli?

Zkouším něco jako
$result = db_query($query);	
			for ($i=0;$i<db_num_rows($result); $i++)
			while ($celkem = db_fetch_array($result)){
				//echo $celkem;
				$TOTAL = $TOTAL + $celkem;
			} 
			echo $TOTAL;

ale pořád jsou tam chyby..
Stepanka
Profil *
Vlastně já už tu jeden součet mám, ale fungoval s tím starým dotazem a s tím novým už nefunguje.
Vypadal takto:
$soucet = 0;
		for ($t_result = db_query($query); !$t_result->EOF; $t_result->MoveNext() ) {
			$soucet += (float)str_replace(",",".",$t_result->fields['value']);
			//echo $t_result->fields['value']."<br>";
		}//for	
		$soucet = str_replace(".",",",$soucet);
		return " <span style=\"color:red;font-family:Courier;\">[celkem -> ".$soucet ." hod]</span>";

Nestačilo by ho nějak pozměnit?
Alphard
Profil
Stepanka
vy používáte vlastní funkce a v tom aby se pak prase vyznalo :-)
hodím sem kód napsaný standardními funkcemi a kdyžtak si je upravte, vzhledem k tomu, že váš zajímá pouze součet, použiji Kajmanovo řešení

$res = mysql_query ("select sum(replace(value, ',', '.')) soucet
from   mantis_custom_field_string_table
where  field_id in (2, 10)
       and bug_id in (select bug_id
                      from   mantis_custom_field_string_table
                      where  field_id = 8
                             and value = 'NE')
group  by field_id
order  by field_id");

$cas = mysql_result ($res, 0, 0);
$castka = mysql_result ($res, 1, 0);
Kajman_
Profil *
Alphard
Raději bych tam nechal to field_id, když nebude žádná práce v hodinách, tak může být v čase částka.

$res = mysql_query ("select field_id, sum(replace(value, ',', '.')) soucet
		from   mantis_custom_field_string_table
		where  field_id in (2, 10)
		       and bug_id in (select bug_id
				      from   mantis_custom_field_string_table
				      where  field_id = 8
					     and value = 'NE')
		group  by field_id
		order  by field_id");
$vysledek=array();
while ($row=mysql_fetch_assoc($res)) $vysledek[$row['field_id']]=$row['soucet']; 
return " <span style=\"color:red;font-family:Courier;\">[celkem -> $vysledek[2] hod, $vysledek[10] Kč]</span>";
Stepanka
Profil *
Oba kódy fungujou perfektně. Použiju asi ten od Kajmana. Líbí se mi, že když nejsou zadané v db žádné finanční částky, ale pouze hodiny (což se stát může, protože hodiny musí být vyplněny, zatímco finanční částka se zapisuje jen v určitých případech), že to vypíše "Celkem xx hod, 0 Kč", a ne "Celkem xx hod, Kč".

Oběma Vám mockrát děkuji, moc jste mi pomohli. Díky.

Alphard
PS: Lidi na diskuzích si přece nevykají, ne? :-)
Stepanka
Profil *
No jo...

ale...

On vlastně ten obsah zůstává neměnný. Já mám nahoře ještě rolovací lištu, kde mám všechny zaměstnance. Když vyberu všechny, zobrazí se mi [celkem -> 6 hodin, 1000 Kč], což je správný součet pro úkoly všech zaměstnanců.

Ale když z té rolovací lišty vyberu jen jednoho a kliknu na "Zobrazit", mělo by se zobrazit něco jako [celkem -> 3,5 hodin, 600 Kč]

Mám totiž ještě před tím takovýto formulář:

$query = "SELECT * 
			FROM mantis_user_table 
			ORDER BY realname ASC";
$result = db_query($query);	

?><form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<select name="user_id">
<option value="0">Vše

<?php
while ($row = db_fetch_array($result)) {	
	echo '<option value = "' .$row['id']. '"' . 
    ((int) $row['id'] === (int) $_POST['user_id'] ? 'selected' : '') . '>'. 
    $row['realname'];
}?>	

</select>
<input type="submit" name="zobrazit" value="<?php echo 'Zobrazit' ?>">
</form>


Bude velký problém to propojit ještě s tímto?

Jestli to není jasné, můžu někam hodit obrázek, jak to vypadá..

Omlouvám se, že nacházím další a další problémy. Toto už by měl být opravdu poslední problém, který se vyskytl.

Děkuju.
Kajman_
Profil *
A jak v tom mantis_custom_field_string_table poznáte, kterého zaměstnance ten záznam je?
Stepanka
Profil *
Kajman_
Tam se to nepozná. Ale tabulka mantis_bug_table vypadá takto:

-- Struktura tabulky `mantis_bug_table`
--

CREATE TABLE IF NOT EXISTS `mantis_bug_table` (
  `id` int(7) unsigned NOT NULL auto_increment,
  `project_id` int(7) unsigned NOT NULL default '0',
  `reporter_id` int(7) unsigned NOT NULL default '0',
  `handler_id` int(7) unsigned NOT NULL default '0',
  `duplicate_id` int(7) unsigned NOT NULL default '0',
  `priority` int(2) NOT NULL default '30',
  `severity` int(2) NOT NULL default '50',
  `reproducibility` int(2) NOT NULL default '10',
  `status` int(2) NOT NULL default '10',
  `resolution` int(2) NOT NULL default '10',
  `projection` int(2) NOT NULL default '10',
  `category` varchar(64) NOT NULL default '',
  `date_submitted` datetime NOT NULL default '1970-01-01 00:00:01',
  `last_updated` datetime NOT NULL default '1970-01-01 00:00:01',
  `eta` int(2) NOT NULL default '10',
  `bug_text_id` int(7) unsigned NOT NULL default '0',
  `os` varchar(32) NOT NULL default '',
  `os_build` varchar(32) NOT NULL default '',
  `platform` varchar(32) NOT NULL default '',
  `version` varchar(64) NOT NULL default '',
  `fixed_in_version` varchar(64) NOT NULL default '',
  `build` varchar(32) NOT NULL default '',
  `profile_id` int(7) unsigned NOT NULL default '0',
  `view_state` int(2) NOT NULL default '10',
  `summary` varchar(128) NOT NULL default '',
  `sponsorship_total` int(7) NOT NULL default '0',
  `sticky` tinyint(1) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `sponsorship_total` (`sponsorship_total`),
  KEY `fixed_in_version` (`fixed_in_version`),
  KEY `status` (`status`),
  KEY `project_id` (`project_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin2 AUTO_INCREMENT=11 ;

--
-- Vypisuji data pro tabulku `mantis_bug_table`
--

INSERT INTO `mantis_bug_table` (`id`, `project_id`, `reporter_id`, `handler_id`, `duplicate_id`, `priority`, `severity`, `reproducibility`, `status`, `resolution`, `projection`, `category`, `date_submitted`, `last_updated`, `eta`, `bug_text_id`, `os`, `os_build`, `platform`, `version`, `fixed_in_version`, `build`, `profile_id`, `view_state`, `summary`, `sponsorship_total`, `sticky`) VALUES
(1, 6, 35, 63, 0, 30, 50, 10, 80, 20, 10, 'RS', '2008-07-02 22:27:35', '2008-08-01 13:42:41', 10, 1, '', '', '', '', '2006-A', '', 0, 10, 'Testovací projekt', 0, 0),  atd.. atd..


Záznamů je tam více, ale asi je zbytečné je zde všechny kopírovat.
Jinak "id" je zde číslo projektu shodné s mantis_custom_field_string_table.bug_id.
A "handler_id" je číslo zaměstnance, který provádí projekt s číslem "id".
Stepanka
Profil *
Vypadá to nějak takto: obrázek zde

Označila jsem jen pracovníka se jménem "Daniel Kolář". Tudíž se vypsali jen dva řádky, protože pracuje na dvou projektech. V tomto případě by se měla sečíst finanční částka a počet hodin jen od zobrazených projektů.. Čili vypsat se [celkem -> 3,5 hodin, 800 Kč]

Moc děkuju, sama to furt zkouším, ale málokdy se mi něco povede :-(
Stepanka
Profil *
Klidně by se to mohlo skládat ze dvou SELECTŮ... Možná i více, pokud to bude nutné. Vyzkouším to vykutit přes více dotazů, třeba se mi to povede..
Stepanka
Profil *
Asi nějak takto by to bylo nejlepší:

Kód té rozbalovací lišty jsem napsala asi o 4 příspěvky výše.
S tím formulářem můžu odeslat nějakou proměnnou $_POST['user_id'], která bude obsahovat ID člověka, který ten projekt vykonává.

A pak v tom SELECTU, který jste mi tady radili, by to stačilo upravit tak, že by se tam přidal SELECT z tabulky mantis_bug_table, kde:

- pokud by bylo z formuláře odeslaná hodnota $_POST['user_id'], by se SELECT omezil jen na řádky kde mantis_custom_field_string_table.bug_id = mantis_bug_table.id AND mantis_bug_table.handler_id = $_POST['user_id'].

- pokud by z formuláře žádná hodnota odeslaná nebyla, nebo bylo zvoleno "Vše", dotaz by zůstal takový, jak jste mi ho napsali předtím.

Pomohli byste mi, prosím, jen s tím dotazem? Myslím, že jinak by to nemělo být tak těžké..

Děkuju moc.
Stepanka
Profil *
Tak už nic, už se mi to povedlo :-) Ale i tak za všechno ostatní děkuju!
Alphard
Profil
PS: Lidi na diskuzích si přece nevykají, ne? :-)
ne, ale Kajman vyká a člověk si pak vedle něho připdadá jako buran :-) takže v diskuzi o databázích poslední dobou vykám také :-)

a abych z toho nedělel chat, tak se ještě vrátím k dotazu, i když jdu s křížkem po funuse
asi nejjednoduší úprava je přidat join do toho vloženého dotazu, přesně jak jste psala ve 14:54, viděl bych to nějak takhle, ale píši to zpaměti
select field_id, sum(replace(value, ',', '.')) soucet
		from   mantis_custom_field_string_table
		where  field_id in (2, 10)
		       and bug_id in (select bug_id
				      from   mantis_custom_field_string_table f
                                           join mantis_bug_table m
                                               on f.bug_id = m.id
                                            where m.handler_id = 7  // id z formulare
				             and f.field_id = 8
					     and f.value = 'NE')
		group  by field_id
		order  by field_id

snad jsem nenapsal nějakou kravinu, už je to dost složité, chtělo by to testovat, ale to už je na vás
Stepanka
Profil *
Alphard
Zkusila jsem to, ale házelo mi to errory, že dotaz v databázi se nezdařil a jaksi se mi to nedařilo opravit, tak použiju to svoje, i když je to napsáno asi velice jednoduše:

$query = "SELECT field_id, sum(replace(value, ',', '.')) soucet
					FROM $t_custom_field_string_table
					WHERE field_id in (2, 10) 
		 			AND bug_id in (
						SELECT bug_id
						FROM $t_custom_field_string_table, $t_bug_table
						WHERE field_id = 8 ";
						if (isset ($_POST['user_id']) AND ($_POST['user_id']) != 0) {
							$query .= " AND $t_custom_field_string_table.bug_id = $t_bug_table.id 
					  					AND $t_bug_table.handler_id = {$_POST['user_id']} ";
						}	
					$query .= " AND value = 'NE')
					GROUP BY field_id
					ORDER BY field_id";


Akorát by ještě bylo fajn, kdyby, v případě, že součet hodin, nebo peněz, bude nula, by to vypsalo i tu nulu. Teď mi to třeba u některých uživatelů vypisuje [celkem -> hodin, Kč], což působí zvláštně. Víc by se mi líbilo, kdyby to ukázalo [celkem -> 0 hodin, 0 Kč] ... ale to už je taková drobnost.
Alphard
Profil
no, zkusil jsem to teda a mně to errory nehází, asi došlo k chybě při implementaci (snad jste smazala ten komentář, // je pro PHP, SQL to nesežere :-))

a pokud jde o nulu, sql bych více nekomplikovat :-) jednoduchá podmínka v PHP by to měla vyřešit
Stepanka
Profil *
Alphard
Komentář jsem samozřejmě smazala... zase až tak špatně na tom nejsem :-)

Ale i tak mi to hází chyby. Akorát tu sedmičku jsem nahradila hodnotou {$_POST['user_id']}, což by mělo být správně. Jinak jsem kód čistě zkopírovala a nic neměnila.
Nevadí mu třeba, že někdy ta hodnota {$_POST['user_id']} nastavená je a někdy není? Může být prázdná, obsahovat nulu nebo jiné číslo.. protože když vymažu ten řádek s POSTem, tak i Váš kód funguje..

A ta php podmínka to asi opravdu vyřeší líp, už jdu na to.
Alphard
Profil
Nevadí mu třeba, že někdy ta hodnota {$_POST['user_id']} nastavená je a někdy není?
aha, to mu teda vadí, opět by to muselo být ošetřené v php, pokud není nastaveno nebo 0, provést původní dotaz
« 1 2 »

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0