Rozdělení jednoho sloupečku na dva sloupečky podle hodnoty

nocturne32
Člen | 21
+
0
-

Zdravím,

mám zadanou následující (zjednodušenou) tabulku:

id			|	description	|	value
------------------------------------------
1			|	Youtube		|	Zná
------------------------------------------
2			|	Youtube		|	Navštěvuje
------------------------------------------
3			|	Youtube		|	Navštěvuje
------------------------------------------
4			|	Youtube		|	Navštěvuje
------------------------------------------
5			|	Youtube		|	Navštěvuje
------------------------------------------
6			|	Twitch		|	Navštěvuje
------------------------------------------
7			|	Twitch		|	Navštěvuje
------------------------------------------
8			|	Twitch		|	Zná
------------------------------------------
9			|	Twitch		|	Zná

A potřeboval bych to mít vypsané podle description, zná a nezná (value jako dva sloupečky):

description	|		Zná	 |	Navštěvuje
------------------------------------------
Youtube		|		1		|		4
------------------------------------------
Twitch		|		2		|		2

Už dvě hodiny zkouším různé zápisy nebo hledám něco na netu, ale pořád bez úspěchu. Napadlo mě využít dvou výběrů, takže pořád nějak zkouším. Kdyžtak sem dávám kus kódu, ačkoliv vím, že je to od vysněného výsledku daleko:

$this->database->table('results')
	->select('description, value, COUNT(value) AS count')
	->group('description')
	->fetchPairs('value','count');

Děkuji předem za případné odpovědi.

CZechBoY
Člen | 3608
+
+1
-

Zalezi co chces mit vypsany. Pokud chces mit vypsany i nuly (nikdo nezna, nepouziva) tak budes muset projit vysledny pole jeste doplnovaci funkci.
Nafetchovat ty data do nejaky obstojny formy by nemel byt problem… zalezi jen na tvych preferencich :-).

Co se tyce sql tak bych groupoval podle obojiho (description, value) a pak budes mit pary
Youtube, pocet znam
Youtube, pocet pouzivam
Twitter, pocet znam
Twitter, pocet pouzivam

nocturne32
Člen | 21
+
0
-

Děkuji za rychlou reakci.

Nulové hodnoty se nezapisují do db myslím (takže by se to tam ani nezobrazilo). S tím by problém být neměl :-).
A takto, jak jsi uvedl, jsem to už nějak měl, ale já bych to potřeboval takto no:
YouTube | zná (počet) | navštěvuje (počet) :-/

Aby ten youtube tam byl pouze jednou.

Edit: hlavně mi jde o to, jestli na to nette nemá nějakou vychytávku, která mi třeba unikla. :-) Neměl by být problém to poskládat nějakým cyklem.

Editoval nocturne32 (16. 7. 2017 14:38)

CZechBoY
Člen | 3608
+
+1
-

Vychytavku maximalne tak na jednodussi zapis struktury pole.
Ty nulovy hodnoty by sis musel dopocitat sam. tzn. kdyz v db nebudes mit nikoho napr. kdo zna youtube.
Pro tu strukturu mrkni na Nette\Utils\Arrays::associate

nocturne32
Člen | 21
+
0
-

Děkuju,
podíval jsem se na ten associate a napadla mě jedna věc.
To fetchAssoc mi to dalo do určité podoby (viz. dump níže), se kterou jsem už mohl lépe pracovat. Pak jsem to následně nějak pospojoval:

$selection = $this->database->table('results_view')
    ->select('description, value, COUNT(value) AS count')
    ->group('description, value')
    ->fetchAssoc('description|value');
$result = [];
$values = [];
foreach($selection as $key => $items) {
    foreach ($items as $key2 => $item) {
        foreach ($item as $key3 => $value) {
            $values[$key2] = $value;
        }
        $result[$key] = $values;
    }
}
return $result;

dump:

array (7)
	"Youtube" => array (2)
		"Navštěvuje" => 227
		"Zná" => 155
	//atd...

A latte:

<table class="table table-striped table-hover">
    <thead>
    <tr>
        <th>Název</th>
        <th>Zná</th>
        <th>Navštěvuje</th>
    </tr>
    </thead>
    <tbody>
    	{foreach $items as $key => $item}
        <tr>
            <td>{$key}</td>
            {foreach $item as $value}
                <td>{$value}</td>
            {/foreach}
        </tr>
    	{/foreach}
    </tbody>
</table>

Nevím, jestli to bylo nejlepší řešení, ale aspoň je to tak, jak to zadavatel chtěl.