Besten,

Ik ben een beginner op het gebied van SQL en tracht wat aanpassingen aan te brengen aan een bestaande site. We hebben daar 2 tabellen :

alarmeringen

1 id
2 timestamp
3 datetime
4 type
5 incident
6 message
7 zoektekst
8 city_id

labels

1 id
2 timestamp
3 messageid
4 incident
5 capcode
6 label

Nu wil ik uit beide tabellen een aantal kolommen opvragen op basis van labels.capcode, waarbij alarmeringen.id correleert met labels.messageid. Ik wil dan alle entries uit labels hebben die dezelfde messageid hebben als de opgegeven capcode, plus wat zaken uit alarmeringen. Ik heb dit in elkaar gezet, maar deze is erg traag en soms krijg ik helemaal geen resultaten (terwijl die er wel zouden moeten zijn) :

SELECT a.id, a.datetime, a.type, a.message, l.incident, l.capcode, l.label
FROM labels as l, alarmeringen as a
WHERE l.messageid = a.id AND l.messageid IN (SELECT messageid FROM labels WHERE capcode = $capcode)
ORDER BY l.id DESC
LIMIT 100

Misschien kan iemand mij wat verder op weg helpen? :)

Groeten, Peter.
Ivo P op 07/12/2016 09:40:39

Volgens mij had je datamodel er meer uit moeten zien als


Dat had misschien mooier geweest, maar ik heb dit dus niet zelf opgezet, ik ben het ook maar als een bestaand project overgenomen :) Ik zou kunnen overwegen om de structuur aan te passen maar ik denk dat daar iets meer bij komt kijken dan een enkele query ;)

Bedankt in elk geval voor je feedback!
Indien de queries traag zijn en de kolommen zich hiervoor lenen dan zou je kunnen overwegen om indexen aan te brengen op de kolom(men) waar je op zoekt. Je zou ook eens kunnen kijken naar de performance door eens een EXPLAIN <je query hier> uit te voeren (je gebruikt MySQL?) en te kijken hoe de tabellen aan elkaar geknoopt worden. Idealiter gaat dit enkel via indexen.

En wat @Ivo zegt. Wanneer je met een administratieef systeem werkt is het zeer belangrijk dat je database goed in elkaar zit en ook goed presteert.
Okee, die EXPLAIN kende ik nog niet...

https://s30.postimg.org/80dx4hbgx/Region.png

Kan ik hier iets mee?

[size=xsmall]Toevoeging op 07/12/2016 23:39:48:[/size]

Ik wil nog even iets verder, als het kan. Tevens wil ik wat meer uitleg geven over hoe/wat. Een jaar geleden is een vriend van mij vrij plotseling overleden. Hij draaide een zogenaamde P2000-website waarop de alarmeringen van de hulpdiensten te zien zijn (deze zijn vrij te ontvangen met simpele middelen). Samen met nog 2 personen hebben wij besloten de site draaiend te houden, maar het is, zelfs een jaar na dato, soms nog steeds lastig om door andermans code heen te worstelen, zeker als je geen expert bent. Voorgaande query was een soort aanvulling. Er zijn echter ook bestaande queries waar ik af en toe wat vraagtekens bij plaats. De website kent enerzijds vrij standaard, transparante weergaven, maar ook hele persoonlijke, met extra instellingen met bijvoorbeeld excludes en includes. Dingen die je juist/wel niet wilt zien in veel mogelijk combinaties. Laat ik vooropstellen, het werkt. Dat betekent uiteraard niet dat de coding altijd optimaal is, maar de gebruiker merkt daar niet veel van. Als er al grove fouten in zitten, dan heb ik een variabele wellicht niet goed uitgeschreven...

Zo kom ik ook deze query tegen, ik heb hem een beetje uit moeten schrijven omdat er nogal wat variabelen in zitten, maar enerzijds vraag ik me af of deze optimaal geschreven is, anderzijds wil ik hier ook de eerder door Ben voorgestelde aanvulling in verwerken, in het vetgedrukte gedeelte :

SELECT a.id, a.datetime, a.message, a.zoektekst, a.type, a.locked, l.incident, l.capcode, l.msgcolor, l.label
FROM alarmeringen AS a, labels AS l
WHERE a.id > 1000 AND l.messageid = a.id AND (l.incregio = 1 OR l.capcode='1234567') AND MATCH(a.zoektekst) AGAINST('brand') OR a.city_id='15025' AND NOT MATCH(a.zoektekst) AGAINST('test')

EDIT: Het kan zijn dat een aantal kolommen lijkt te ontbreken tov mijn eerdere posting. Dat komt omdat ik eerder een aantal kolommen heb weggelaten omdat die voor de betreffende query niet van toepassing waren. Ze zijn echter -uiteraard- wel aanwezig.

Reageren