Využij akce až 30 % zdarma při nákupu e-learningu. Více informací. Zároveň je tento týden sleva až 80 % na e-learning týkající se C# .NET
Hledáme nového kolegu do redakce - 100% home office, 100% flexibilní pracovní doba. Více informací.
Avatar
BuBu6
Člen
Avatar
BuBu6:12.3.2020 3:06

Ahoj, potřeboval bych prosím zase poradit.
Mám výpis z DB třeba zkráceně takto:

foreach ($tabulka as $tab) {
        echo '<h3>'.$tab['datum_start].' - '.$tab['datum_konec'].'</h3>';
}

Vypíše mi to několik řádků, třeba 30 (dle záznamů).

Zkusil jsem: Několik hodin jsem strávil na netu hledáním a studováním, kde bych našel alespoň menší nápovědu, ale nenašel jsem nic.

Chci docílit: Snažím se dosáhnou toho, abych mezi řádky vždy porovnal datum, resp. třeba na řádku 10 vypsal celkový čas od konce akce řádku 10 ($tab[datum_konec]) do začátku nové akce na řádku 11 ($tab[datum_star­t]).
Počet řádků je proměnlivý, takže porovnávání stylem SELECT.....ně­co.....LIMIT 10,1 a SELECT....něco­....LIMIT 11,1 je nefunkční, navíc mi to nepřijde ani moc "programátorské".

Snad je dotaz pochopitelný a budu rád za každou radu. Díky.

 
Odpovědět
12.3.2020 3:06
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:12.3.2020 8:25

A co 2 selecty?
SELECT tab2.x, tab2.y, tab2.z FROM (SELECT ... FROM tab1 ... ORDER BY ... LIMIT) tab2

Mozna by slo nacist 2x tutez tabulku, jenom do jednoho sloupce pridat COUNT() a ve druhe COUNT() + 1. Hodnoty zapsat jako +tab1.value, -tab2.value. A pak to zgrupovat podle sloupce s count pomoci SUM.

[id, order, value] tab
1, 'a', 3
2, 'x', 8
3, 'b', 4

tab1 = SELECT `id, `order`, `value` FROM `tab`... ORDER BY `order` ASC
1, 'a', 3
3, 'b', 4
2, 'x', 8

tab2 = SELECT `id`, `order`, `value`, COUNT() AS `group` FROM `tab1`
1, 'a', 3, 1
3, 'b', 4, 2
2, 'x', 8, 3

tab3 = SELECT `id`, `order`, -`value`, COUNT()+1 AS `group` FROM `tab1`
1, 'a', -3, 2
3, 'b', -4, 3
2, 'x', -8, 4

JOIN tab2 + tab3
1, 'a', 3, 1
3, 'b', 4, 2
2, 'x', 8, 3
1, 'a', -3, 2
3, 'b', -4, 3
2, 'x', -8, 4

GROUP BY `order` + SUM
1, 'a', 3, 1
3, 'b', 4, 2 | 1, 'a', -3, 2 = 3, 'b', 4-3, 2
2, 'x', 8, 3 | 3, 'b', -4, 3 = 2, 'x', 8-4, 3
2, 'x', -8, 4

google = How to calculate value of column row 1 + row 2
https://www.codeproject.com/…row-plus-row

WITH CTE AS(
  SELECT rownum = ROW_NUMBER() OVER (ORDER BY a.clientID), a.JumlahClient
  FROM   GroupAttendance a
)
SELECT
        CTE.JumlahClient JumlahHadir,
        prev.JumlahClient + CTE.JumlahClient SumTotal
FROM CTE
        LEFT JOIN CTE prev ON prev.rownum = CTE.rownum - 1
 
Nahoru Odpovědět
12.3.2020 8:25
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:12.3.2020 8:38

S tim googlem by to slo napsat takto, asi. kde prvni tab2 nahradis tim dvojitym selectem. Dvojitym, protoze prvnim si to vytahnes ve spravnem poradi a pak k tomu pridavas ten count. Mozna bude treba pro left join rozepsat tab2 tez na select+select.

SELECT
        `tab2`.`id`,
        `tab2`.`order`,
        `tab2`.`value` - `tab3`.`value` `diff`
FROM `tab2`
        LEFT JOIN `tab2` `tab3` ON `tab3`.`count` = `tab2`.`count` - 1
--
SELECT
        `tab2`.`id`,
        `tab2`.`order`,
        `tab2`.`value` - `tab3`.`value` `diff`
FROM (SELECT...COUNT() AS `count` (SELECT)) `tab2`
        LEFT JOIN `tab2` `tab3` ON `tab3`.`count` = `tab2`.`count` - 1
--        LEFT JOIN (SELECT...COUNT() AS `count` (SELECT...)) `tab3` ON `tab3`.`count` = `tab2`.`count` - 1
-- stejny, protoze to joinujes podle count a count-1, `tab3`.`count` = `tab2`.`count` - 1
 
Nahoru Odpovědět
12.3.2020 8:38
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
BuBu6
Člen
Avatar
BuBu6:12.3.2020 18:38

Jsem těžký amatér, ale vůbec jsem to nepochopil. Možná jsem to napsal blbě. Zkusím to napsat jinak. Ve výpise z DB pomocí FOREACH budu mít následující tři sloupce (id akce, datum start, datum konec):

řádek1: id1 - start1 - konec1
řádek2: id2 - start2 - konec2
řádek3: id3 - start3 - konec3
řádek4: id4 - start4 - konec4
řádek5: id5 - start5 - konec5
... atd.

A já nyní potřebuji ke každému řádku zjistit, kolik uběhlo času mezi koncem jedné akce (konec1) a začátkem druhé akce (start2). A takhle vypsat všechny časy mezi jednotlivými řádky, tedy čas mezi konec2-start3, konec3-start4,...atd. Výpis by pak vypadal takto:

řádek1: id1 - start1 - konec1 - NULL
řádek2: id2 - start2 - konec2 - čas mezi akcemi
řádek3: id3 - start3 - konec3 - čas mezi akcemi
řádek4: id4 - start4 - konec4 - čas mezi akcemi
řádek5: id5 - start5 - konec5 - čas mezi akcemi
... atd.

Vždy se jedná o DATETIME na mezičas TIME.
Z výše uvedených příkladů jsem to vůbec nepochopil. Takže i když budu vypadat jako blbec, prosím o nějaké "laické" vysvětlení.
Díky moc.

 
Nahoru Odpovědět
12.3.2020 18:38
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:13.3.2020 8:25

Tak jinak

SELECT `id`, `order`, SUM(`value`) AS
FROM (
      SELECT `id`, `order`, `date1` AS `value`, COUNT() AS `x` FROM `tab1` ... ORDER BY ...
      UNION ALL
      SELECT `id`, `order`, -`date2` AS `value`, COUNT()+1 AS `x` FROM `tab1` ... ORDER BY ...
      ) `tab2` -- spojena tab musi mit jmeno/alias
GROUP BY `tab2`.`x`

Vyberes tabulku podle tvych pozadavku a pridas sloupec x=count(). (cislovani radku 1, 2, 3, 4...)
Totez, jine datum, jiny x, x=count()+1 (2, 3, 4...)
A podle tohoto sloupce X to zgrupujes a provedes sumu.

 
Nahoru Odpovědět
13.3.2020 8:25
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.