Ik heb een probleem bij het sorteren van resultaten in een query. De resultaten uit de tabel planning_shifts worden anders gesorteerd dan de resultaten uit de tabel planning_shifts. Het gaat om de volgende query:
De tabellen zijn als volgt gerelateerd:
planning_projects:
Waarbij fk_did een foreign key is naar did in mDepartment, oftewel het department id.
planning_shifts:
Waarbij fk_pp_id een foreign key is naar id in planning_projects, oftewel het project id.
planning_shift_days:
Waarbij fk_ps_id een foreign key is naar id in planning_shifts, oftewel het shift id.
planning_regular_shifts:
Waarbij fk_ps_id een foreign key is naar id in planning_shifts, oftewel het shift id, en fk_pid een foreign key naar pid in person, oftewel het persoons id.
Het probleem is nu dat de tabel planning_projects anders gesorteerd wordt dan planning_shifts. Hierdoor is het onmogelijk om het shift id te koppelen aan de shift en het project. De waarde van regular_shift is dan dus ook niet meer te koppelen aan het bijbehorende project en de shift.
Wie weet waar dit probleem door wordt veroorzaakt en, belangrijker, hoe dit is op te lossen? Zoals je ziet sorteer ik het geheel al op planning_shifts.sort, dit zou dus het probleem niet kunnen zijn.
SQL:
Die ik aanroep met bijvoorbeeld de volgende query: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
| CREATE PROCEDURE `load_regular_days`( did int(11), pid int(11) ) BEGIN SELECT planning_shift_days.day AS weekday, GROUP_CONCAT(planning_projects.name ORDER BY planning_shifts.sort) AS projects, GROUP_CONCAT(planning_shifts.name ORDER BY planning_shifts.sort) AS shifts, GROUP_CONCAT(planning_shifts.id ORDER BY planning_shifts.sort) AS shift_id, planning_regular_shifts.fk_ps_id AS regular_shift, planning_regular_shifts.remark AS shift_remark FROM planning_shift_days JOIN ( planning_projects, planning_shifts ) ON planning_projects.fk_did = did AND planning_projects.id = planning_shifts.fk_pp_id AND planning_shifts.id = planning_shift_days.fk_ps_id LEFT JOIN planning_regular_shifts ON planning_regular_shifts.day = planning_shift_days.day AND planning_regular_shifts.fk_pid = pid GROUP BY planning_shift_days.day ORDER BY planning_shift_days.day; END |
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| mysql> CALL load_regular_days(1, 851); +---------+------------------------+---------------------------------------+----------+---------------+-------------------------+ | weekday | projects | shifts | shift_id | regular_shift | shift_remark | +---------+------------------------+---------------------------------------+----------+---------------+-------------------------+ | 1 | Nelson,Opkikker,Nelson | door2door,Straatwerving,Straatwerving | 1,3,2 | 3 | Test vastedag opmerking | | 2 | Opkikker,Nelson,Nelson | Straatwerving,door2door,Straatwerving | 3,1,2 | 1 | Test vastedag opmerking | | 3 | Opkikker,Nelson,Nelson | Straatwerving,door2door,Straatwerving | 3,1,2 | NULL | NULL | | 4 | Nelson,Opkikker,Nelson | door2door,Straatwerving,Straatwerving | 1,3,2 | NULL | NULL | | 5 | Nelson,Opkikker,Nelson | door2door,Straatwerving,Straatwerving | 1,3,2 | 1 | Test vastedag opmerking | | 6 | Opkikker,Nelson,Nelson | Straatwerving,door2door,Straatwerving | 3,1,2 | NULL | NULL | | 7 | Opkikker,Nelson,Nelson | Straatwerving,door2door,Straatwerving | 3,1,2 | NULL | NULL | +---------+------------------------+---------------------------------------+----------+---------------+-------------------------+ 7 rows in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) |
De tabellen zijn als volgt gerelateerd:
planning_projects:
code:
1
2
3
4
5
6
7
8
| +--------+-----------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+-----------------+------+-----+---------+----------------+ | id | int(4) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(16) | NO | | | | | fk_did | int(4) unsigned | NO | MUL | | | | sort | int(4) unsigned | NO | MUL | | | +--------+-----------------+------+-----+---------+----------------+ |
Waarbij fk_did een foreign key is naar did in mDepartment, oftewel het department id.
planning_shifts:
code:
1
2
3
4
5
6
7
8
9
10
| +------------+-----------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+-----------------+------+-----+---------+----------------+ | id | int(8) unsigned | NO | PRI | NULL | auto_increment | | fk_pp_id | int(4) unsigned | NO | MUL | 0 | | | name | varchar(16) | NO | | | | | start_date | date | NO | | | | | end_date | date | NO | | | | | sort | int(4) unsigned | NO | MUL | | | +------------+-----------------+------+-----+---------+----------------+ |
Waarbij fk_pp_id een foreign key is naar id in planning_projects, oftewel het project id.
planning_shift_days:
code:
1
2
3
4
5
6
7
8
9
10
| +------------+-----------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+-----------------+------+-----+---------+----------------+ | id | int(8) unsigned | NO | PRI | NULL | auto_increment | | fk_pp_id | int(4) unsigned | NO | MUL | 0 | | | name | varchar(16) | NO | | | | | start_date | date | NO | | | | | end_date | date | NO | | | | | sort | int(4) unsigned | NO | MUL | | | +------------+-----------------+------+-----+---------+----------------+ |
Waarbij fk_ps_id een foreign key is naar id in planning_shifts, oftewel het shift id.
planning_regular_shifts:
code:
1
2
3
4
5
6
7
8
9
| +----------+-----------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+-----------------+------+-----+---------+----------------+ | id | int(8) unsigned | NO | PRI | NULL | auto_increment | | fk_ps_id | int(8) unsigned | NO | | 0 | | | fk_pid | int(11) | NO | MUL | 0 | | | day | int(1) | NO | | NULL | | | remark | varchar(64) | NO | | | | +----------+-----------------+------+-----+---------+----------------+ |
Waarbij fk_ps_id een foreign key is naar id in planning_shifts, oftewel het shift id, en fk_pid een foreign key naar pid in person, oftewel het persoons id.
Het probleem is nu dat de tabel planning_projects anders gesorteerd wordt dan planning_shifts. Hierdoor is het onmogelijk om het shift id te koppelen aan de shift en het project. De waarde van regular_shift is dan dus ook niet meer te koppelen aan het bijbehorende project en de shift.
Wie weet waar dit probleem door wordt veroorzaakt en, belangrijker, hoe dit is op te lossen? Zoals je ziet sorteer ik het geheel al op planning_shifts.sort, dit zou dus het probleem niet kunnen zijn.
Ik ontken het bestaan van IE.