[MySQL] Rijen naast elkaar krijgen in kolommen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Black-Xjuh
  • Registratie: Oktober 2002
  • Laatst online: 14-04 10:23
Ik heb een tabel met daarin telkens vier waardes, een timestamp, een deviceid, sensorid en een value.

Nu wil ik graag aan de hand van 3 verschillende sensorid's een waarde berekenen in één query.

Dus eigen wil ik:

SELECT * FROM tabel WHERE deviceid = 1 AND (sensorid = 1 OR sensorid = 2 OR sensorid = 3) GROUP BY timestamp

Het probleem is dan dus dat ik als resultaat krijg

timestamp, deviceid, sensorid, value van 1 van de 3 records waar die de GROUP BY op deed (timestamps zijn altijd hetzelfde)

Wat ik graag zou willen ipv bovenstaande is een soort GROUP BY maar dan als resultaat
timestamp, deviceid, sensorid, value1, value2, value3

En dan kan ik dus doen SELECT (value1 + value2 + value3) AS result

Acties:
  • 0 Henk 'm!

  • Thomasje
  • Registratie: Augustus 2002
  • Laatst online: 29-05-2024

Thomasje

Semacode

Zijn die timestamps wel exact het zelfde? Anders kan je daar natuurlijk nooit een GROUP BY op doen.

Wat lukt er precies niet?

Acties:
  • 0 Henk 'm!

  • Black-Xjuh
  • Registratie: Oktober 2002
  • Laatst online: 14-04 10:23
Timestamps zijn het zelfde ja.

Maar probleem is dat er dubbele bij zitten..

Waardoor je JOINS krijgt van 100 * 100 * 100 * 100 wat alles onnodig groot maakt bij een query als deze:

SELECT
a.t,
a.v,
b.v,
c.v
FROM
d.l a
JOIN d.l b
ON a.t = b.t AND b.d = 301 AND b.s = 2
JOIN d.l c
ON a.t = c.t AND c.d = 301 AND c.s = 3
WHERE
a.d = 301 AND a.s = 1

t = timestamp
d = device
s = sensor
v = value

Maar timestamp zijn precies het zelfde al wil ik uiteindelijk geen GROUP BY doen maar dat was als voorbeeld, ik wil eigen in plaats van GROUP BY MAX(value) een GROUP BY DE_VELDEN_ALS_KOLOMMEN_NAAST_ELKAAR(value)

Is dit een beetje duidelijk zoals ik het uitleg?

Acties:
  • 0 Henk 'm!

  • Thomasje
  • Registratie: Augustus 2002
  • Laatst online: 29-05-2024

Thomasje

Semacode

Kan je dan niet beter gebruik maken van sub query's?

Even snel:

SELECT (SELECT MAX(value) FROM d as b WHERE a.d = b.d AND b.s = 1) as value FROM a WHERE a.d = 301


Hoop dat ik de var namen beetje goed heb gebruikt? Maar gaat om het idee, je kan op die manier de values bij elkaar optellen door achter de b.s = 1 dezelfde query te herhalen met een + ervoor.

[ Voor 37% gewijzigd door Thomasje op 11-12-2009 11:33 ]


Acties:
  • 0 Henk 'm!

  • Black-Xjuh
  • Registratie: Oktober 2002
  • Laatst online: 14-04 10:23
Ja net niet helemaal.. Ik snap je idee maar de berekeningen gaan wat verder dan optellen.

Maar wat je zegt, de kolommen hoeven niet perse naast elkaar te staan als ik

d s t v
0 1 1 1 5
1 1 2 1 7
2 1 3 1 4

heb en dat ik dan dus een soort GROUP BY doe op t en dan de verschillende v's in volgorde kan gebruiken is het natuurlijk ook goed.

Acties:
  • 0 Henk 'm!

  • Thomasje
  • Registratie: Augustus 2002
  • Laatst online: 29-05-2024

Thomasje

Semacode

Hoe gaan de berekeningen dan? In MySQL kan ook gewoon berekent worden.

Acties:
  • 0 Henk 'm!

  • Black-Xjuh
  • Registratie: Oktober 2002
  • Laatst online: 14-04 10:23
Ja ik wil juist rekenen in mysql maar dan moet ik wel de variabele bij elkaar krijgen.

Een berekening bijvoorbeeld is:

(d-(log10((e/(((v+2048000)/4096000)*1024)-1)*1000))*1000)/100*f

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

je omschrijving is mij niet helemaal duidelijk, maar als ik naar je code voorbeelden kijk krijg ik het idee dat je de drie waarden op wilt tellen. Daarvoor hoef je ze niet naast elkaar te zetten. Daarvoor heb je SUM in sql.

SELECT timestamp, deviceid, SUM(value) FROM tabel WHERE deviceid = 1 AND (sensorid = 1 OR sensorid = 2 OR sensorid = 3) GROUP BY timestamp, deviceid


--edit--

Owh, en als de berekening ingewikkelder is dan zou ik dat niet in sql gaan doen. ipv group by een order by gebruiken en dan bij het uitlezen de berekening record voor record uitvoeren.

[ Voor 21% gewijzigd door Janoz op 11-12-2009 14:06 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1