Samenvoegen van rijen
Ik heb deze database:
ID (Int)
Timestamp (Timestamp)
Melding (Text)
Capcode (Int)
Label (Varchar)
Daarin staan meldingen van hulpdiensten. Alles werkt prima. Nu wil ik die meldingen netjes gaan weergeven met php uit de database. Ook dat gaat prima. Nu wil ik alleen de 'dubbele meldingen' samenvoegen. Er zijn namelijk meldingen die bijna hetzelfde zijn in de database, behalve 2 waardes: capcode en label. Is het mogelijk om die samengevoegd te tonen? Ik kwam een soortgelijk topic uit 2010 tegen in het forum maar daar werd geen oplossing gegeven dus vandaar een nieuw topic.
Voorbeeld:
PRIO 1 6198 6230 6171 STRAATNAAM PLAATSNAAM Letsel (Beknelling: ) (INC: 04)
123456 - Capcode label - melding label
PRIO 1 6198 6230 6171 STRAATNAAM PLAATSNAAM Letsel (Beknelling: ) (INC: 04)
654321 - Capcode label - melding label
Die wil ik gaan tonen als:
PRIO 1 6198 6230 6171 STRAATNAAM PLAATSNAAM Letsel (Beknelling: ) (INC: 04)
123456 - Capcode label - melding label
654321 - Capcode label - melding label
De capcode labels worden dmv een join uit een andere tabel opgehaald.
$sql = mysql_query("SELECT * FROM alarmeringen LEFT JOIN capcode on alarmeringen.capcode = capcode.cap_capcode ORDER BY id DESC LIMIT 0, 50") or die (mysql_error());
Ben al bezig geweest met GROUP BY melding maar toen werden de meldingen alles behalve bij elkaar getoond.
Wie kan mij helpen?
Alvast bedankt!
Gewijzigd op 21/10/2013 10:49:39 door Niek van Oost
Kolommen die in de select staan en niet in aggegrate functie moeten nl. in de group by benoemd worden.
Daarnaast moet je dus minimaal 1 aggegrate functie in je query hebben, meestal in de select, maar mag eventueel ook in de having clause (of beide).
Je krijgt dan zoiets:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
SELECT
a.melding,
MAX(a.timestamp) timestamp,
GROUP_CONCAT(CONCAT_WS(' - ', a.capcode, c.label, a.label) SEPARATOR '|') combi
FROM
alarmeringen a
JOIN
capcodes c
ON a.capcode = c.cap_capcode
GROUP BY melding
ORDER BY timestamp DESC
a.melding,
MAX(a.timestamp) timestamp,
GROUP_CONCAT(CONCAT_WS(' - ', a.capcode, c.label, a.label) SEPARATOR '|') combi
FROM
alarmeringen a
JOIN
capcodes c
ON a.capcode = c.cap_capcode
GROUP BY melding
ORDER BY timestamp DESC
Dit is geen mooie query, en eigenlijk kan je dit gewoon beter in php oplossen.
Gewijzigd op 21/10/2013 15:03:14 door Niek van Oost
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$pointer = ''; //$pointer == ''
$end = '';
while ($item = $result->fetch_assoc()) {
if ($item['melding'] != $pointer) {
// nieuwe groep, dus
//beeindig vorige
echo $end;
$end = '</div>';
//begin nieuwe
$pointer = $item['melding'];
echo '<div class="melding_groep"><div class="melding_tekst">',
$pointer = $item['melding'], '</div>';
}
// en dan hier de dingen voor de capcodes etc.
}
?>
$pointer = ''; //$pointer == ''
$end = '';
while ($item = $result->fetch_assoc()) {
if ($item['melding'] != $pointer) {
// nieuwe groep, dus
//beeindig vorige
echo $end;
$end = '</div>';
//begin nieuwe
$pointer = $item['melding'];
echo '<div class="melding_groep"><div class="melding_tekst">',
$pointer = $item['melding'], '</div>';
}
// en dan hier de dingen voor de capcodes etc.
}
?>
Let wel op dat als je in twee verschillende tabellen kolommen met dezelfde naam hebt maar met verschillende waardes, je één van de twee een alias moet geven, anders krijg je er maar één in de assoc. array
Gewijzigd op 21/10/2013 18:23:22 door Ger van Steenderen
Thanks! Dat werkt! Super!
Wat is php toch lief, stond toch wel een aardig foutje in mijn eerste code (ik kan zelf ook maar beter bij Walt Disney gaan solliciteren).