Join met val elk records de meest actuele

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Richard veldman

richard veldman

16/09/2016 21:53:49
Quote Anchor link
Beste allen,

Omdat php en mysql een beetje een hobby is ben ik dus niet een expert.
Misschien dat ik daarom niet de oplossing vind voor dit probleem:

SELECT *
FROM tr_objecten
INNER JOIN data_tracking1
ON tr_objecten.imei = data_tracking1.IMEI WHERE DATE_TIME_STAMP + INTERVAL 10 MINUTE > NOW() ORDER BY data_tracking1.id DESC";

De opzet is als volgt:
In de database tr_objecten staan de unieke objecten met hun imei nummer.
Elk object stuur in elk geval elke 10 minuten een signaal met daarin zijn imei nummer welke in de database data_tracking1 wordt opgeslagen. Daaruit wil ik hebben: Van alle objecten welke zowel in tr_objecten als in data_tracking1 voorkomen de meest actuele.

De bovenstaande code werkt op zich wel maar krijg ik van elk object de laatste meldingen van de laatste 10 minuten. Dat lijkt goed maar de objecten sturen ook signalen tussen door bijvoorbeeld als ze verplaatsen. Maar ik wil enkel het meest actuele records per imei nummer...
LIMIT 1 werkt dus niet want dan krijg het van alle objecten gezamenlijk de laatste (is dus maar 1 terwijl er meerdere objecten zijn...)
Als er 20 objecten zijn wil ik dus ook 20 resultaten...
Gewijzigd op 16/09/2016 21:55:21 door Richard veldman
 
PHP hulp

PHP hulp

16/11/2024 00:40:00
 
Frank Nietbelangrijk

Frank Nietbelangrijk

16/09/2016 23:30:44
Quote Anchor link
is DATE_TIME_STAMP de naam van een kolom in de database?

Je kunt de aggregate functie MAX() gebruiken in combinatie met een GROUP BY.

probeersel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
SELECT o.imei, dt.id, MAX(dt.DATE_TIME_STAMP)
FROM tr_objecten o
INNER JOIN data_tracking1 dt
ON o.imei = dt.IMEI
WHERE dt.DATE_TIME_STAMP + INTERVAL 10 MINUTE > NOW()
GROUP BY o.imei
ORDER BY dt.id DESC";
 
Richard veldman

richard veldman

20/09/2016 19:00:26
Quote Anchor link
Oke, ik heb nu dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$query
= "
SELECT *
FROM tr_objecten
INNER JOIN data_tracking1
ON tr_objecten.imei = data_tracking1.IMEI
WHERE DATE_TIME_STAMP + INTERVAL 1 DAY > NOW()
GROUP BY tr_objecten.imei
ORDER BY data_tracking1.ID DESC
"
;
?>

Maar nu krijg ik het oudste record terwijl ik de nieuwste wil.
Dat geef ik toch aan met DESC?
Gewijzigd op 20/09/2016 19:13:58 door richard veldman
 
Frank Nietbelangrijk

Frank Nietbelangrijk

20/09/2016 19:49:48
Quote Anchor link
ASC == oplopend (Dus begin je met de laagste waarde)
DESC == aflopend (Dus begin je met de hoogste waarde)

Volgens mij moet je dus ASC hebben...
 
Richard veldman

richard veldman

20/09/2016 19:56:48
Quote Anchor link
Had ik ook al even geprobeerd maar dan heb ik het zelfde resultaat.
Het lijkt er dus een beetje op alsof de ORDE BY niet doet wat ik verwacht...
 
Frank Nietbelangrijk

Frank Nietbelangrijk

20/09/2016 19:58:57
Quote Anchor link
Kun jij eens aangeven Welke kolomnamen je hebt in de tabel tr_objecten en data_tracking1?
 
Richard veldman

richard veldman

20/09/2016 20:11:30
Quote Anchor link
data_tracking1:
`ID` int(11) NOT NULL AUTO_INCREMENT,
`DATE_TIME_STAMP` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`DATE` varchar(15) NOT NULL,
`TIME` time NOT NULL,
`LAT` varchar(10) NOT NULL,
`LON` varchar(10) NOT NULL,
`LATN` varchar(15) NOT NULL,
`LONN` varchar(15) NOT NULL,
`ALT` varchar(6) NOT NULL,
`SPEED` varchar(6) NOT NULL,
`COURSE` varchar(20) NOT NULL,
PRIMARY KEY (`ID`)

tr_objecten:

`id` int(5) NOT NULL AUTO_INCREMENT,
`tonen` int(1) NOT NULL DEFAULT '0',
`member` varchar(30) NOT NULL,
`naam` varchar(20) NOT NULL,
`type` varchar(10) NOT NULL,
`database` varchar(20) NOT NULL,
`imei` varchar(20) NOT NULL,
`sim` varchar(20) NOT NULL,
`telnr` varchar(10) NOT NULL,
PRIMARY KEY (`id`)
 
Frank Nietbelangrijk

Frank Nietbelangrijk

20/09/2016 20:20:07
Quote Anchor link
Dank je. Ik mis in jouw query de MAX(dt.DATE_TIME_STAMP). Die heb je wel nodig want GROUP BY zorgt er wel voor dat je maar 1 record per imei nummer krijgt maar zorgt er niet voor dat dit ene record dan ook de meest actuele is.
 
Richard veldman

richard veldman

20/09/2016 20:23:24
Quote Anchor link
Je bedoeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$query
= "
SELECT *
MAX(data_tracking1.DATE_TIME_STAMP)
FROM tr_objecten
INNER JOIN data_tracking1
ON tr_objecten.imei = data_tracking1.IMEI
WHERE DATE_TIME_STAMP + INTERVAL 1 DAY > NOW()
GROUP BY tr_objecten.imei
ORDER BY data_tracking1.ID ASC
"
;
?>


Maar dan krijg ik niets meer terug.
Als ik dat MAX eruit haal krijg ik van elk object 1 record terug uit de data_tracking1.
Maar dan dus het oudste record ipv het jongste...
Gewijzigd op 20/09/2016 20:24:25 door richard veldman
 
Frank Nietbelangrijk

Frank Nietbelangrijk

20/09/2016 22:38:23
Quote Anchor link
er moet een komma tussen de kolomnamen dus :

SELECT *, MAX(data_tracking1.DATE_TIME_STAMP)

Toevoeging op 20/09/2016 22:40:12:

Je doet dus ook niets aan foutafhandeling. Anders kreeg je wel een nette foutmelding.
 
Richard veldman

richard veldman

23/09/2016 13:03:13
Quote Anchor link
Ik snap er niets van.
Ook nu blijf ik het oudste record zien ipv het nieuwste....
Of ik nu DESC of ASC gebruik...
Gewijzigd op 23/09/2016 16:50:00 door richard veldman
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

27/09/2016 11:09:17
Quote Anchor link
Je gebruikt de group by verkeerd, de combinatie SELECT * en group_by kan niet.
De eerste stap is bepalen wat het laatst ingevoerde record in datatracking voor een imeinummer is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
SELECT
    IMEI,
    MAX(id)
FROM
    datatracking1
WHERE DATE_TIME_STAMP > NOW() - INTERVAL 1 DAY
GROUP BY IMEI

Let op het verschil in de where!

Dit zet je dan in een subquery en dan ga je de anderen gegevens erbij halen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT
    o.IMEI,
    o.naam,
    t.DATE_TIME_STAMP
FROM
    (
    SELECT
        IMEI,
        MAX(ID)max_id
    FROM
        data_tracking1
    WHERE DATE_TIME_STAMP > NOW() - INTERVAL 1 DAY
    GROUP BY IMEI
    ) s
JOIN
    tr_objecten o ON s.IMEI = o.imei
JOIN
    data_tracking1 t ON s.max_id = t.ID
 
Richard veldman

richard veldman

27/09/2016 21:34:26
Quote Anchor link
Wat geweldig, het werkt!
Bedankt!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.