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.
Waarom heb je die subquery? Die is zinloos omdat je de tabel labels toch al gebruikt.

Probeer eens iets als volgt:

SELECT a.id, a.datetime, a.type, a.message, l.incident, l.capcode, l.label	
FROM labels as l
JOIN alarmeringen as a ON l.messageid = a.id
WHERE l.capcode = '$capcode'
ORDER BY l.id DESC
LIMIT 100


Je zou er ook goed aan doen om op iets anders te sorteren dat een id, maar dat terzijde.
Vergeet ook $capcode niet te escapen.
Ben van Velzen op 06/12/2016 22:10:09

Waarom heb je die subquery? Die is zinloos omdat je de tabel labels toch al gebruikt.

Probeer eens iets als volgt:

SELECT a.id, a.datetime, a.type, a.message, l.incident, l.capcode, l.label	
FROM labels as l
JOIN alarmeringen as a ON l.messageid = a.id
WHERE l.capcode = '$capcode'
ORDER BY l.id DESC
LIMIT 100


Je zou er ook goed aan doen om op iets anders te sorteren dat een id, maar dat terzijde.
Vergeet ook $capcode niet te escapen.


Geprobeerd, maar dit geeft niet het gewenste resultaat :

http://monitor.p2kflex.nl/index.php?capcode=1500050

Waar je een groene "GROUP-1" ziet staan daar zouden meerdere regels onder elkaar moeten verschijnen (de "labels"). Hij pakt dus wel de 'capcode', dus het begin is er. Maar niet de andere entries die bij deze groep horen (lees: zelfde messageid)
Klopt je structuur dan wel? Want je label heeft een capcode, daar filter je op. Hoort de capcode dan niet bij de alarmering?
Ben van Velzen op 06/12/2016 22:32:57

Klopt je structuur dan wel? Want je label heeft een capcode, daar filter je op. Hoort de capcode dan niet bij de alarmering?


Nouja, misschien was mijn oorspronkelijke query niet helemaal netjes, maar die gaf wel het gewenste resultaat, zij het dat het soms erg lang duurde of helemaal niet werkte (erg onbetrouwbaar dus). De site draait verder probleemloos en de structuur is (mijns inziens) op orde, maar ik heb het niet zelf geschreven, slechts overgenomen enige tijd terug. Wellicht zijn alle queries niet helemaal standaard, geen idee. Ik merk wel dat alles vrij snel gaat, alleen wat ik nu zelf probeer gaat de mist in. Dus ik ga er vanuit dat ik nu zelf de fout in ga en dat de rest redelijk goed gaat. Navigeer eens op de site (knoppen onderin). Je zult wellicht niet weten wat je qua output moet verwachten, maar het gaat in elk geval redelijk vlot. Dan zie je in elk geval hoe de groepen eruit zouden moeten zien. Elke groep heeft een eigen id/messageid en volgens mij zit dat wel snor. Ik ging wat Googelen en kwam toen uit op die subqueries, vandaar mijn vage coding :)
zoals ik het begrijp, wil je alle meldingen EN alle labels voor meldingen die in elk geval $capcode als een van de labels heeft?
Ivo P op 06/12/2016 22:44:13

zoals ik het begrijp, wil je alle meldingen EN alle labels voor meldingen die in elk geval $capcode als een van de labels heeft?


Volgens mij heb je dat redelijk goed verwoord, ja :)
dan mis ik denk ik een tabel

ik verwacht een tabel Meldinge
Een tabel Labels

en een tabel die de meldingen en de labels aan elkaar koppelt.

Want kennelijk sla je nu voor elke melding een compleet label op. Stel het label is "voorbeeld" en je wilt dat aanpassen naar "Voorbeeld", dan moet je nu dus alle entry's af?

Zoiets dan?

SELECT a.id, a.datetime, a.type, a.message, l2.incident, l2.capcode, l2.label    
FROM labels as l1
JOIN alarmeringen as a ON l1.messageid = a.id
JOIN labels as l2 ON l2.messageid = a.id
WHERE l1.capcode = '$capcode'
ORDER BY l1.id DESC
LIMIT 100

Ben,

Deze lijkt exact te doen wat ik wil! Ik test nog even verder, maar dat wordt morgen :)

Bedankt zo ver!!

Groeten, Peter.
Volgens mij had je datamodel er meer uit moeten zien als

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

tabel labels
1 id
2 capcode
3 label

koppeltabel labels_alarmeringen
1 alarmering_id
2 label_id

de query zou dan worden

SELECT a.id, a.datetime, a.`type`, a.incident, l.label, l.capcode

FROM alarmeringen a
JOIN labels_alarmeringen la ON la.alarmering_id = a.id
JOIN labels l on l.id = la.label_id

GROUP BY a.id, a.datetime, a.`type`, a.incident, l.label, l.capcode
HAVING SUM(l.capcode = '$capcode') > 0

Reageren