Pobranie rozbitych danych z MySQL

0

Cześć!

Jeśli dane w tabelce będę miał w takiej postaci:

id time a_val b_val
1   0    0     0
2   1    0     0
3   2    0     0
4   3    0     0
...
...

Wtedy dane z danego przedziału czasowego mogę pobrać tak:

SELECT `a_val`, `b_val` FROM `tab` WHERE `time` BETWEEN '1' AND '9'

Niestety struktura tabeli, oraz dane wyglądają tak:

id time name value
1   0    a     0
2   0    b     0
3   1    a     0
4   1    b     0
...
...

Jak powinno wyglądać zapytanie, by otrzymać dane w formie jak w zapytaniu z pierwszego zapytania?

0

Trzeba to pogrupować, ale nie możesz użyć id:

select
    time,
   sum(case when name = 'a' then value else 0 end) as a_val,
   sum(case when name = 'b' then value else 0 end) as b_val
from
   tab
where
    time between 1 and 9
group by
    time
0

Dziękuję za odpowiedź!
Co jeśli value będzie stringiem?

0

Użyj wtedy group_concat:

SELECT
    TIME,
   GROUP_CONCAT(CASE WHEN name = 'a' THEN VALUE ELSE '' END SEPARATOR '') AS a_val,
   GROUP_CONCAT(CASE WHEN name = 'b' THEN VALUE ELSE '' END SEPARATOR '') AS b_val
FROM
   tab
WHERE
    TIME BETWEEN 1 AND 9
GROUP BY
    TIME
0

Dobra załapałem ideę.
Ostatnie pytanie dotyczące typu danych :) A co jeśli dane są blobem?

Takie sumowanie nie będzie wolne?
Każdy wiersz jest sumą wszystkich (leci przez warunek), więc jeśli w bazie jest ponad 10 milionów różnych wpisów to nie siądzie to mocno na wydajności takiego zapytania?

0

Nie wiem co dla bloba, proponuje przetestować, zakladając że group_concat zwraca bloba to powinien też połączyć. Nie miałem nigdy takiej potrzeby.

Sumowanie i agregacje to chleb powszedni dla baz danych, wydajność i szybkość zależy w głównej mierze od zapytania, ale też od wielu innych czynników i wymaga przetestowania.

0

Domyslnie GROUP_CONCAT ma ograniczenie chyba do 1000 znaków (sprawdź w dokumentacji), więc dla BLOBów raczej się nie sprawdza...

1 użytkowników online, w tym zalogowanych: 0, gości: 1