Na verschillende problemen opgelost te hebben, kom ik weer wat gekke dingen tegen waar ik geen oplossing voor kan vinden. Misschien heb ik het verkeerd aangepakt, maar dat zal dan wel blijken.
Een reminder bestaat uit een start datum en een periode. Op de start datum + periode krijg je een notificatie. Dan kan er een history entry toegevoegd worden, als er iets met de 'herinnering' gedaan is. Op dat moment word er voor een nieuwe notificatie de datum van de laatste history entry gepakt + de periode van de reminder zelf.
Dat werkt allemaal, maar nu wil ik een selectie maken van de reminders binnen een bepaalde herinneringsperiode. Helaas gaat dat niet helemaal goed, maar het probleem lijkt niet eenduidig. Soms met en soms zonder history entries, of zelfs gewoon allebei. Dus klopt wel wat ik in onderstaande (versimpelde) query doe? Sowieso de verschillende terugkomende subselects lijken me niet erg handig, maar hoe anders?
Het ORDER BY gedeelte werkt prima, maar nu ik een BETWEEN toevoeg gaat het fout. Ik denk dat het IF statement niet goed werkt, maar is er een andere manier om dit te doen?
Een reminder bestaat uit een start datum en een periode. Op de start datum + periode krijg je een notificatie. Dan kan er een history entry toegevoegd worden, als er iets met de 'herinnering' gedaan is. Op dat moment word er voor een nieuwe notificatie de datum van de laatste history entry gepakt + de periode van de reminder zelf.
Dat werkt allemaal, maar nu wil ik een selectie maken van de reminders binnen een bepaalde herinneringsperiode. Helaas gaat dat niet helemaal goed, maar het probleem lijkt niet eenduidig. Soms met en soms zonder history entries, of zelfs gewoon allebei. Dus klopt wel wat ik in onderstaande (versimpelde) query doe? Sowieso de verschillende terugkomende subselects lijken me niet erg handig, maar hoe anders?
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| SELECT reminder.id, reminder.start_date, reminder.period, (SELECT reminder_history.date FROM reminder_history WHERE reminder_history.reminder_id = reminder.id ORDER BY reminder_history.date DESC LIMIT 1 ) AS latest_reminder_history_date FROM reminder WHERE IF ( (SELECT reminder_history.date FROM reminder_history WHERE reminder_history.reminder_id = reminder.id ORDER BY reminder_history.date DESC LIMIT 1) IS NULL, DATE_ADD(reminder.start_date, INTERVAL reminder.period DAY), DATE_ADD((SELECT reminder_history.date FROM reminder_history WHERE reminder_history.reminder_id = reminder.id ORDER BY reminder_history.date DESC LIMIT 1), INTERVAL reminder.period DAY) ) BETWEEN '2014-1-1' AND '2014-12-31' ORDER BY IF ( latest_reminder_history_date IS NULL, DATE_ADD(reminder.start_date, INTERVAL reminder.period DAY), DATE_ADD(latest_reminder_history_date, INTERVAL reminder.period DAY) ) ASC |
Het ORDER BY gedeelte werkt prima, maar nu ik een BETWEEN toevoeg gaat het fout. Ik denk dat het IF statement niet goed werkt, maar is er een andere manier om dit te doen?