Rozdělení jednoho sloupečku na dva sloupečky podle hodnoty
- nocturne32
- Člen | 21
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
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
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)
- nocturne32
- Člen | 21
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.