Hoi,
Ik heb een probleem met een query.
Dit zijn de tabellen die ik gebruik:
Het is een problem-management systeem waar per probleem_id oplossingen geboden kunnen worden op verschillende niveau's.
Die niveau's worden gerepresenteerd door de tabel Keten, waar een lager view_order hogere rechten betekent (a la linux, root == 0).
Nu heb ik de volgende query:
Met deze query wil ik bereiken dat ik in mijn resultaat alle keten_namen en view_orders te zien krijg die groter of gelijk zijn aan de view_order tot waartoe de gebruiker behoort (in deze query behoort 'ie dus tot de ProblemManagers).
En dan wil ik verder dat MySQL er twee velden uit de Oplossingen tabel aan koppelt (te weten aanmaak_datum en oplossing_omschrijving) voor de ketens waar een oplossing_omschrijving bestaat.
Dus met de bovenstaande data verwacht ik eigenlijk de volgende resultset:
Maar helaas krijg ik deze resultset terug:
Dus het ziet er naar uit dat als er geen overeenkomstige oplossing uit dezelfde keten is in de Oplossing-tabel (IS NULL), dat 'ie de rest maar helemaal eruit filtert.
Hoe kan ik ervoor zorgen dat 'ie toch ALLE KETENS gewoon weergeeft, en daar waar er oplossingen zijn, dat 'ie ze ook laat zien?
Nog wat relevante data:
Ik draai MySQL 4.1.11 uit de Debian Testing branche.
Ik maak van de OUTER JOIN gebruik omdat ik het volgende las op: http://mysqld.active-venture.com/IS_NULL_optimisation.html
If you use column_name IS NULL on a NOT NULL in a WHERE clause on table that is not used OUTER JOIN that expression will be optimised away
Ik heb een probleem met een query.
Dit zijn de tabellen die ik gebruik:
code:
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
35
36
37
38
39
40
41
42
| mysql> describe Keten; +------------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+------------------+------+-----+---------+-------+ | keten_naam | varchar(16) | | PRI | | | | view_order | int(10) unsigned | | | 0 | | +------------+------------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> select * from Keten; +------------------+------------+ | keten_naam | view_order | +------------------+------------+ | ProblemManagers | 0 | | Support | 1 | | FieldEngineer | 2 | | IncidentEngineer | 3 | | KlantIngang | 4 | +------------------+------------+ 5 rows in set (0.00 sec) mysql> describe Oplossing; +------------------------+------------------+------+-----+---------------------+-------+ | Field | Type | Null | Key | Default | Extra | +------------------------+------------------+------+-----+---------------------+-------+ | probleem_id | int(10) unsigned | | PRI | 0 | | | aanmaak_datum | datetime | | | 0000-00-00 00:00:00 | | | oplossing_omschrijving | text | | MUL | | | | keten_naam | varchar(16) | | PRI | | | +------------------------+------------------+------+-----+---------------------+-------+ 4 rows in set (0.00 sec) mysql> select * from Oplossing WHERE probleem_id = 2; +-------------+---------------------+------------------------------------------------------------+------------------+ | probleem_id | aanmaak_datum | oplossing_omschrijving | keten_naam | +-------------+---------------------+------------------------------------------------------------+------------------+ | 2 | 2005-06-08 18:32:28 | IncidentEngineer | IncidentEngineer | | 2 | 2005-06-08 18:32:04 | KlantIngang | KlantIngang | | 2 | 2005-06-08 16:21:00 | En we vullen hier gewoon al een oplossing in op PM-niveau. | ProblemManagers | +-------------+---------------------+------------------------------------------------------------+------------------+ 3 rows in set (0.00 sec) |
Het is een problem-management systeem waar per probleem_id oplossingen geboden kunnen worden op verschillende niveau's.
Die niveau's worden gerepresenteerd door de tabel Keten, waar een lager view_order hogere rechten betekent (a la linux, root == 0).
Nu heb ik de volgende query:
code:
1
2
3
4
5
| SELECT Keten.keten_naam, Keten.view_order, Oplossing.aanmaak_datum, Oplossing.oplossing_omschrijving FROM Keten LEFT OUTER JOIN Oplossing ON Oplossing.keten_naam = Keten.keten_naam WHERE Keten.view_order >= (SELECT Keten.view_order FROM Keten WHERE Keten.keten_naam = "ProblemManagers") AND Oplossing.probleem_id = 2 OR Oplossing.probleem_id IS NULL ORDER BY Keten.view_order ASC; |
Met deze query wil ik bereiken dat ik in mijn resultaat alle keten_namen en view_orders te zien krijg die groter of gelijk zijn aan de view_order tot waartoe de gebruiker behoort (in deze query behoort 'ie dus tot de ProblemManagers).
En dan wil ik verder dat MySQL er twee velden uit de Oplossingen tabel aan koppelt (te weten aanmaak_datum en oplossing_omschrijving) voor de ketens waar een oplossing_omschrijving bestaat.
Dus met de bovenstaande data verwacht ik eigenlijk de volgende resultset:
code:
1
2
3
4
5
6
7
8
9
10
| +------------------+------------+---------------------+------------------------------------------------------------+ | keten_naam | view_order | aanmaak_datum | oplossing_omschrijving | +------------------+------------+---------------------+------------------------------------------------------------+ | ProblemManagers | 0 | 2005-06-08 16:21:00 | En we vullen hier gewoon al een oplossing in op PM-niveau. | | Support | 1 | NULL | NULL | | FieldEngineer | 2 | NULL | NULL | | IncidentEngineer | 3 | 2005-06-08 18:32:28 | IncidentEngineer | | KlantIngang | 4 | 2005-06-08 18:32:04 | KlantIngang | +------------------+------------+---------------------+------------------------------------------------------------+ 5 rows in set (0.00 sec) |
Maar helaas krijg ik deze resultset terug:
code:
1
2
3
4
5
6
7
8
| +------------------+------------+---------------------+------------------------------------------------------------+ | keten_naam | view_order | aanmaak_datum | oplossing_omschrijving | +------------------+------------+---------------------+------------------------------------------------------------+ | ProblemManagers | 0 | 2005-06-08 16:21:00 | En we vullen hier gewoon al een oplossing in op PM-niveau. | | IncidentEngineer | 3 | 2005-06-08 18:32:28 | IncidentEngineer | | KlantIngang | 4 | 2005-06-08 18:32:04 | KlantIngang | +------------------+------------+---------------------+------------------------------------------------------------+ 3 rows in set (0.00 sec) |
Dus het ziet er naar uit dat als er geen overeenkomstige oplossing uit dezelfde keten is in de Oplossing-tabel (IS NULL), dat 'ie de rest maar helemaal eruit filtert.
Hoe kan ik ervoor zorgen dat 'ie toch ALLE KETENS gewoon weergeeft, en daar waar er oplossingen zijn, dat 'ie ze ook laat zien?
Nog wat relevante data:
Ik draai MySQL 4.1.11 uit de Debian Testing branche.
Ik maak van de OUTER JOIN gebruik omdat ik het volgende las op: http://mysqld.active-venture.com/IS_NULL_optimisation.html
If you use column_name IS NULL on a NOT NULL in a WHERE clause on table that is not used OUTER JOIN that expression will be optimised away