Ik heb een server waar clients verbinding kunnen doen (een "session"), in een zo'n session doet een client meerdere aanvragen ("requests"). Een request is uniek door de combinatie van verschillende informatie, en kan goed gaan of niet.
Deze akties wil ik graag loggen en hiervoor heb ik een MySQL database opgezet, die ziet er als volgt uit:
Voor elke sessie wordt het IP adres en de tijd dat deze sessie plaatsvond gelogd:
Elk request hoort bij een sessie, en logt de sessieinformatie + de failed flag:
In de database staat wat test data, waardoor het geheel er zo uit ziet:
Sessions:
Requests:
Nu wil ik met een query graag zien welke unieke requests er in de afgelopen 7 dagen zijn mislukt, en hoe vaak, dat is gelukt met de volgende query:
En daar komt dit uit:
So far so good.
Nu wil ik graag de query aanpassen, zodat ik alleen de items zie die de laatste keer dat ze requested waren op failed stonden. De combinatie 2 en A hoort daar niet bij, op 10 januari was die gefaild, maar op 12 januari niet. Dit lukt me niet.
Nu heb ik twee vragen:
- Is het ontwerp voor dit doel een beetje OK zo?
- Hoe kan ik de query aanpassen zodat ie doet wat hij moet doen?
Hier een SQL fiddle met de hele zwik.
Deze akties wil ik graag loggen en hiervoor heb ik een MySQL database opgezet, die ziet er als volgt uit:
Voor elke sessie wordt het IP adres en de tijd dat deze sessie plaatsvond gelogd:
code:
1
2
3
4
5
6
7
| CREATE TABLE IF NOT EXISTS `sessions` ( `ID` int(11) unsigned NOT NULL AUTO_INCREMENT, `IP` char(15) NOT NULL, `Timestamp` datetime NOT NULL, PRIMARY KEY (`ID`), KEY `Timestamp` (`Timestamp`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
Elk request hoort bij een sessie, en logt de sessieinformatie + de failed flag:
code:
1
2
3
4
5
6
7
8
9
10
11
| CREATE TABLE IF NOT EXISTS `requests` ( `ID` int(11) unsigned NOT NULL AUTO_INCREMENT, `SessionID` int(11) unsigned NOT NULL, `RequestInfo1` char(3) NOT NULL, `RequestInfo2` char(5) NOT NULL, `Failed` enum('Y','N') NOT NULL, PRIMARY KEY (`ID`), KEY `Missing` (`Failed`) KEY `FK_SessionID` (`SessionID`), CONSTRAINT `FK_SessionID` FOREIGN KEY (`SessionID`) REFERENCES `sessions` (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
In de database staat wat test data, waardoor het geheel er zo uit ziet:
Sessions:
code:
1
2
3
4
5
| | ID | IP | Timestamp | |----|---------|----------------------| | 1 | 1.2.3.4 | 2018-01-10T12:00:00Z | | 2 | 1.2.3.4 | 2018-01-11T12:00:00Z | | 3 | 1.2.3.4 | 2018-01-12T12:00:00Z | |
Requests:
code:
1
2
3
4
5
6
7
8
| | ID | SessionID | RequestInfo1 | RequestInfo2 | Failed | |----|-----------|--------------|--------------|--------| | 1 | 1 | 1 | A | Y | | 2 | 1 | 1 | B | N | | 3 | 2 | 1 | A | Y | | 4 | 2 | 2 | A | Y | | 5 | 3 | 2 | B | Y | | 6 | 3 | 2 | A | N | |
Nu wil ik met een query graag zien welke unieke requests er in de afgelopen 7 dagen zijn mislukt, en hoe vaak, dat is gelukt met de volgende query:
code:
1
2
3
4
5
6
7
8
9
10
11
12
| SELECT r.RequestInfo1, r.RequestInfo2, Count(*) AS Times FROM sessions s join requests r ON s.ID = r.SessionID WHERE r.Failed = 'Y' AND s.TimeStamp BETWEEN Date_sub(Curdate(), interval 7 day) AND Date_add(Curdate(), interval 1 day) GROUP BY r.RequestInfo1, r.RequestInfo2 ORDER BY Times DESC; |
En daar komt dit uit:
code:
1
2
3
4
5
| | RequestInfo1 | RequestInfo2 | Times | |--------------|--------------|-------| | 1 | A | 2 | | 2 | A | 1 | | 2 | B | 1 | |
So far so good.
Nu wil ik graag de query aanpassen, zodat ik alleen de items zie die de laatste keer dat ze requested waren op failed stonden. De combinatie 2 en A hoort daar niet bij, op 10 januari was die gefaild, maar op 12 januari niet. Dit lukt me niet.
Nu heb ik twee vragen:
- Is het ontwerp voor dit doel een beetje OK zo?
- Hoe kan ik de query aanpassen zodat ie doet wat hij moet doen?
Hier een SQL fiddle met de hele zwik.
[ Voor 4% gewijzigd door MerijnB op 12-01-2018 23:28 . Reden: vergeten foreign key erbij te zetten ]
A software developer is someone who looks both left and right when crossing a one-way street.