Ik zit vast met een query voor hetvolgende uit te voeren (indien mogelijk):
Ik lees alle tickets uit vanuit tabel ticket, dit zijn de basis gegevens maar zonder de gebruikersnamen.
Om deze terug te vinden is er een tabel: relationship.
De waarde r.target_id die volgt uit t.base_id & r.source_id overeenkomen en r.relationshiptype = '15E577A3-6BF9-6713-4EAC-BA5A5B7C4722' is u.base_id waar ik dan weer de username wil weten, dit is dan de affected user. Maar er is ook nog r.relationshiptype = 'DF738111-C7A2-B450-5872-C5F3B927481A' en de username die daaruit volgt is de assigned user.
Nog een probleem is dat hij enkel de meest recente relationshiptype mag nemen die overeenkomt.
Is dit mogelijk om in 1 query uit te voeren?
Tot zover ben ik:
$sql = "SELECT t.ticket_id, t.baseid, t.title, t.createddate, r.target_id, r.relationshiptype FROM scsm_ticket t
RIGHT JOIN scsm_relationship r ON t.base_id = r.source_id && (r.relationshiptype = 'DF738111-C7A2-B450-5872-C5F3B927481A' OR r.relationshiptype = '15E577A3-6BF9-6713-4EAC-BA5A5B7C4722')
WHERE
t.status NOT IN ('Closed', 'Cancelled', 'Closed by user', 'Failed', 'Completed', 'Resolved', '')
&&
(t.ticket_type = 'Service Request' or t.ticket_type = 'Incident') GROUP BY t.ticket_id";
Opbouw tabellen:
Tabel ticket t
- base_id
- ticket_id
- title
- createddate
- status
- ticket_type
Omdat het twee verschillende users betreft en de relationshiptypes niet overeenkomen zul je waarschijnlijk beide tabellen (zowel user alsook relationship) twee keer onder aparte aliassen moeten opnemen in de query om dit alles aan elkaar te breien denk ik.
Maar wat voor systeem is dit? En ik denk dat twee queries een stuk makkelijker is.
Die 15E577A3 et cetera klinkt nog steeds als een soort van hard coded relatie, zou dat niet gewoon een aparte koppeltabel moeten zijn? Zowel affected users alsook assigned users zouden aparte koppeltabellen moeten worden tussen users en tickets? Idealiter uiteraard.
Ideaal zou het inderdaad een andere tabel zijn alleen heeft Microsoft het zo niet opgebouwd. Op amper 20 000 tickets is de relatietabel 2GB groot en heeft ruim 5 miljoen records.
Maar ik zou inderdaad alles kunnen opsplitsen in andere tabellen bij het inlezen, dat maakt het zoeken in ieder geval een heel pak sneller.
Oh je kunt de boel ook sneller maken door indexen aan te maken, bijvoorbeeld op relationship.relationship_type, mocht je dat nog niet gedaan hebben. Zorg in ieder geval dat alle kolommen waarmee je tabellen aan elkaar knoopt geïndexeerd zijn.