[mysql] ORDER probleem bij JOIN

Pagina: 1
Acties:

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
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:

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
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
Die ik aanroep met bijvoorbeeld de volgende query:

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.


Verwijderd

SQL:
1
GROUP_CONCAT(planning_projects.name ORDER BY planning_shifts.sort)    AS      projects,
't Is al verbazend dat bovenstaande code een resultaat oplevert, aangezien je geen enkel verband tussen planning_projects en planning_shifts legt, maar ja, dat soort glazen bol eigenschappen ben ik ondertussen wel van MySQL gewend...

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Verwijderd schreef op zondag 25 februari 2007 @ 17:56:
[...]
't Is al verbazend dat bovenstaande code een resultaat oplevert, aangezien je geen enkel verband tussen planning_projects en planning_shifts legt, maar ja, dat soort glazen bol eigenschappen ben ik ondertussen wel van MySQL gewend...
code:
1
2
3
4
5
6
7
8
9
        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


Hier leg ik toch een link tussen planning_projects en planning_shifts? Wat bedoel je precies?

Ik ontken het bestaan van IE.


  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

Het zal wel aan mij liggen maar in je ON specificeer je normal gesproken conditionele expressie (table1.id = table2.fid) i.p.v. domweg een aantal kolommen van je tabellen te specificeren (of is dit weer een MySQL extensie?).

Daarnaast is je JOIN een cross join met planning_shift_days en zie ik geen directe join van projects met shifts.

"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


  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Creepy schreef op zondag 25 februari 2007 @ 18:58:
Het zal wel aan mij liggen maar in je ON specificeer je normal gesproken conditionele expressie (table1.id = table2.fid) i.p.v. domweg een aantal kolommen van je tabellen te specificeren (of is dit weer een MySQL extensie?).

Daarnaast is je JOIN een cross join met planning_shift_days en zie ik geen directe join van projects met shifts.
Psst, zie je die scrollbar ;) ?

Ik ontken het bestaan van IE.


Verwijderd

Door die join leg je wel een relatie in de hoofdquery, maar niet in die GROUP_CONCAT(), wat in feite een subquery is.

  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

|:( :+
* Creepy moet nog echt wakker worden geloof ik...

[ Voor 12% gewijzigd door Creepy op 25-02-2007 19:36 ]

"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


  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Verwijderd schreef op zondag 25 februari 2007 @ 19:03:
Door die join leg je wel een relatie in de hoofdquery, maar niet in die GROUP_CONCAT(), wat in feite een subquery is.
Hoe kan ik dan een link opgeven in de GROUP_CONCAT? In de documentatie vind ik die mogelijkheid niet terug.

Ik ontken het bestaan van IE.


Verwijderd

Niet, bij mijn weten. Tenzij je van die query een view maakt en daar de GROUP_CONCAT() op los laat.

Maar ja, ik ben geen MySQL kenner, en heb nog nooit een GROUP_CONCAT() functie nodig gehad, dus ik kan ernaast zitten...
Pagina: 1