[MySQL] JOIN commando

Pagina: 1
Acties:

Onderwerpen


  • aard01
  • Registratie: Augustus 2006
  • Laatst online: 17:04
Ik krijg mijn SQL statement niet werkend.

Ik wil het volgende uitvoeren op twee tabellen die ik heb (pvfacts en p1facts). pvfacts logt iedere 10 seconden de hoeveelheid opgewekte energie uit mijn zonnepanelen, p1facts logt iedere 10 seconden mijn energiemeter inkoop en levering. Beide tabellen worden echter NIET synchroon gelogd, dus ze moeten op minutenbasis (of op 10-tallen secondenbasis) naast elkaar gelegd worden.

pvfacts is opgebouwd uit de kolommen timestamp, RealtimePower
p1facts is opgebouwd uit de kolommen timestamp, kw_inkoop, kw_levering

Deze tabellen wil ik combineren om in een oogopslag te kunnen zien wat mijn eigen verbruik is (realtimepower + inkoop - levering = eigen verbruik).

Ik ben tot het volgende SQL statement gekomen:

code:
1
2
3
4
5
6
$sql='SELECT substr(timestamp, 12, 5) time, kw_inkoop, kw_levering FROM p1facts 
RIGHT JOIN RealtimePower FROM pvfacts
ON substr(p1facts.timestamp,12,5)=substr(pvfacts.timestamp,12,5) 
WHERE time between date("' . $today . '") and adddate(date("' . $today . '"), INTERVAL 1 day)
GROUP by time 
ORDER by time';


Ik krijg hierop een foutmelding die aangeeft dat het statement in de buurt van ON niet correct is. Ik heb van alles geprobeerd (ook substr verwijderd), maar ik krijg het niet aan de gang. Vanaf het WHERE statement weet ik dat dit correct is, deze werkt goed als ik maar 1 tabel selecteer.

Wie o wie kan mij de uiteindelijke tip geven? _/-\o_

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Waarom laat je string functies los op een datetime? :X *hint*

Het is overigens dat (o.a.) INTERVAL weggeeft dat 't hier om MySQL gaat, maar het is handig dat voortaan even erbij te vermelden... /tagfix0red

[ Voor 77% gewijzigd door RobIII op 12-09-2012 22:31 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • aard01
  • Registratie: Augustus 2006
  • Laatst online: 17:04
De timestamp is als volgt opgebouwd: ''jjjj-mm-dd hh:mm:ss'' en ik wil alleen kijken naar de hh:mm in mijn grafiek. Dit lost m.i. ook gelijk het probleem op van het asynchroon loggen.

Toch?

Dit statement werkt in ieder geval goed:

code:
1
2
3
$sql='select substr(timestamp, 12, 5) time, kw_inkoop, kw_levering from p1facts
where timestamp between date("' . $today . '") and adddate(date("' . $today . '"), interval 1 day)
group by time order by time';

[ Voor 41% gewijzigd door aard01 op 12-09-2012 22:31 ]


  • juhet
  • Registratie: November 2007
  • Laatst online: 11:34
Je hebt twee keer een FROM-clause...

3 leuke cadeautips voor een theeliefhebber!


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
aard01 schreef op woensdag 12 september 2012 @ 22:30:
De timestamp is als volgt opgebouwd: ''jjjj-mm-dd hh:mm:ss''
Nee, je timestamp is in de tool die jij gebruikt (PHPMyAdmin gok ik?) toevallig gerepresenteerd als "jjjj-mm-dd hh:mm:ss". En MySQL zeurt er toevallig niet over dat je een DateTime in Substr mikkert en probeert er 't beste van te bakken...
Check m'n hint nog eens...
juhet schreef op woensdag 12 september 2012 @ 22:31:
Je hebt twee keer een FROM-clause...
:D Ook nog ja; die had ik niet eens gezien :P

[ Voor 23% gewijzigd door RobIII op 12-09-2012 22:34 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • aard01
  • Registratie: Augustus 2006
  • Laatst online: 17:04
juhet schreef op woensdag 12 september 2012 @ 22:31:
Je hebt twee keer een FROM-clause...
noop, dit is volgens mij wat je bedoelt:

code:
1
2
3
4
$sql='SELECT substr(timestamp, 12, 5) time, kw_inkoop, kw_levering RIGHT JOIN
 pvfacts.RealtimePower FROM p1facts ON p1facts.timestamp=pvfacts.timestamp 
WHERE time between date("' . $today . '") and adddate(date("' . $today . '"), interval 1 day)
group by time order by time';


Maar dit werkt ook niet...

  • juhet
  • Registratie: November 2007
  • Laatst online: 11:34
...

[ Voor 101% gewijzigd door juhet op 12-09-2012 22:40 ]

3 leuke cadeautips voor een theeliefhebber!


  • aard01
  • Registratie: Augustus 2006
  • Laatst online: 17:04
Ik heb dit nu geprobeerd door de tweede FROM weg te halen:

code:
1
2
3
4
$sql='SELECT substr(timestamp, 12, 5) time, kw_inkoop, kw_levering FROM p1facts RIGHT JOIN 
pvfacts.RealtimePower ON p1facts.timestamp=pvfacts.timestamp 
WHERE time between date("' . $today . '") and adddate(date("' . $today . '"), interval 1 day) 
group by time order by time';


Ik krijg nu de foutmelding dat pvfacts.RealtimePower niet zou bestaan? Maar deze zit er wel degelijk in, in de tabel pvfacts (en ja, ook op hoofdletters gecontroleerd ;)

edit: sorry, code gecorrigeerd

[ Voor 5% gewijzigd door aard01 op 12-09-2012 22:46 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
aard01 schreef op woensdag 12 september 2012 @ 22:44:
Ik krijg nu de foutmelding dat pvfacts.RealtimePower niet zou bestaan?
Verklaar dit eens:
aard01 schreef op woensdag 12 september 2012 @ 22:22:
SQL:
1
2
FROM p1facts 
RIGHT JOIN RealtimePower FROM pvfacts
Wordt opeens:
aard01 schreef op woensdag 12 september 2012 @ 22:44:
SQL:
1
2
FROM p1facts
RIGHT JOIN pvfacts.RealtimePower
:?
Misschien is het handig om even de basis onder de knie te krijgen voordat je verder gaat?
Met alle respect maar je posts, so far in dit topic, schitteren niet bepaald van de kennis en zijn voornamelijk van het type "*DUMP-QUERY-ACHTIG-IETS* Deze query doet 't nie, en nu?". En we zitten hier nou niet echt om handjes te houden.

[ Voor 32% gewijzigd door RobIII op 12-09-2012 22:51 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • aard01
  • Registratie: Augustus 2006
  • Laatst online: 17:04
Ik heb wel wat basis kennis, maar ik zit met die twee tabellen.

De tweede FROM heb ik nu weggehaald, maar ik moet wel aangeven dat ik de waarde RealtimePower uit de tabel pvfacts moet halen. Dit kan ik volgens mij doen door ''pvfacts.'' ervoor te zetten. Maar dat pikt ie niet....

Geen idee waar ik het moet zoeken...

  • aard01
  • Registratie: Augustus 2006
  • Laatst online: 17:04
RobIII schreef op woensdag 12 september 2012 @ 22:48:
Misschien is het handig om even de basis onder de knie te krijgen voordat je verder gaat?
Met alle respect maar je posts, so far in dit topic, schitteren niet bepaald van de kennis en zijn voornamelijk van het type "*DUMP-QUERY-ACHTIG-IETS* Deze query doet 't nie, en nu?". En we zitten hier nou niet echt om handjes te houden.
Sorry hoor, maar deze reactie kan ik niet plaatsen! Ik zit al avonden te studeren op SQL en ben al aardig ver met queries die uit 1 tabel komen en ja, ik geef toe dat deze er niet professioneel uitzien, maar ze werken voor mij wel. Nu heb ik een probleem en krijg de deksel op de neus...

Als ik zelf nog niks geprobeerd zou hebben dan had je recht van spreken. Voor jullie is het wellicht hartstikke eenvoudig, maar voor mij blijft het een hobby. Als het al zo eenvoudig is wat ik vraag, waarom geef je dan niet direct een querie hoe het dan wel moet?

Maar laat maar, ik zoek het zelf wel uit!

  • Mint
  • Registratie: Mei 2005
  • Laatst online: 21-09 22:06
aard01 schreef op woensdag 12 september 2012 @ 23:01:
[...]


Sorry hoor, maar deze reactie kan ik niet plaatsen! Ik zit al avonden te studeren op SQL en ben al aardig ver met queries die uit 1 tabel komen en ja, ik geef toe dat deze er niet professioneel uitzien, maar ze werken voor mij wel. Nu heb ik een probleem en krijg de deksel op de neus...

Als ik zelf nog niks geprobeerd zou hebben dan had je recht van spreken. Voor jullie is het wellicht hartstikke eenvoudig, maar voor mij blijft het een hobby. Als het al zo eenvoudig is wat ik vraag, waarom geef je dan niet direct een querie hoe het dan wel moet?

Maar laat maar, ik zoek het zelf wel uit!
Omdat wanneer iemand jou een kant-en-klare oplossing geeft, jij niet leert wat er fout is in de huidige situatie.

Verder, wanneer je uit meerdere tabellen selecteert en daarnaast kolommen van verschillende tabellen wilt benaderen in je query, moet je de tabel een naam geven in de query. Maak er bijvoorbeeld dit van:


MySQL:
1
FROM pvfacts pvf


Daarbij raad ik je ten zeerste aan om naar de hint van RobIII te kijken. Timestamps als dusdanig opslaan is uiteraard de bedoeling, maar om er vervolgens strings van te gaan maken haalt het hele nut van deze datatype in de database weg. Volgens die theorie kun je net zo goed alles als longtext opslaan zodat je er alles in kan knallen wat je wilt, omdat je laterna toch zelf checks moet doen.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21-09 21:47

Creepy

Tactical Espionage Splatterer

Sorry, maar je mist echt basiskennis SQL en je gokt maar wat om iets uit een tweede tabel te selecteren. Je kan inderdaad een JOIN gebruiken daarvoor. Hoe een JOIN werkt staat prima uitgelegd in onze Programming FAQ - SQL . Je hebt een vraag over SQL maar je leest niet eens wat documentatie erover door, roept dat je wel degelijk basiskennis hebt (sorry maar nee) en vervolgens vraag je maar direct een werkend voorbeeld? Daar leer je dan weer zo weinig van. Lees de SQL FAQ eens door en dan zul je hopelijk zelf ook zien dat je nog wat basiskennis miste ;)

[ Voor 9% gewijzigd door Creepy op 12-09-2012 23:18 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1