[SQL] Samenvoegen meerdere personen op één adres tbv mailing

Pagina: 1
Acties:
  • 443 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • ToMaSZ
  • Registratie: Januari 2000
  • Laatst online: 07:58
Ik loop een beetje vast. Ben geen SQL-held, maar kom een redelijk stukje.
Wat ik wil is dat als in mijn adressentabel (lidgegevens) meerdere personen op 1 adres wonen (PC/Huisnummer gelijk), de namen worden samengevoegd (Als Fullname) voor de adreslabels.

Ik heb de volgende Query:
SQL:
1
2
3
4
5
6
7
8
9
10
SELECT DISTINCT
  IF(CONCAT(a.postcode, a.huisnummer) = CONCAT(b.postcode, b.huisnummer),
    CONCAT(b.voornaam, ' ', b.achternaam, ', ', a.voornaam, ' ', a.achternaam), 
    CONCAT(a.voornaam, ' ', a.achternaam))
    AS FullName, a.straat, a.huisnummer, a.postcode, a.plaats
    FROM lidgegevens AS a 
        LEFT JOIN lidgegevens b ON (a.voornaam <> b.voornaam OR a.achternaam <> b.achternaam) 
          AND a.postcode = b.postcode 
          AND a.huisnummer = b.huisnummer 
        ORDER BY a.postcode ASC

Resultaat is nu dat het voor 2 personen op één adres goed gaat (komt wel 2x voor: naam1, naam2 EN naam2, naam1, maar dat is gemakkelijk te verhelpen met een GROUP BY).

We hebben echter ook adressen waar 4 personen wonen. Wat er nu gebeurt is dat ik alle cobinaties van 2 personen terugkrijg (volkomen logisch), maar na 2 dagen alleen maar niet-werkende oplossingen te hebben geprobeerd, ga ik het toch vragen.. Is er iemand die me in de juiste richting kan duwen? :)
Concrete vraag dus: Hoe breid ik bovenstaande uit voor meer dan 2 personen op één adres?

[ Voor 3% gewijzigd door ToMaSZ op 06-01-2008 14:05 ]

What the eyes see, and the ears hear, the mind believes...


Acties:
  • 0 Henk 'm!

  • Blackbird-ce
  • Registratie: September 2005
  • Laatst online: 02-06 19:01
Ik zou dit zelf, indien mogelijk, niet uitvoeren in de query zelf maar alle resultaten te sorteren op (postcode, huisnr). Vervolgens in de applicatie de vorige combinatie (postcode, huisnr) bijhouden en vergelijken met de huidige record. De applicatie kan dan beslissen of de naam van de huidige record moet worden toegevoegd aan het etiketje, of dat de vorige 'verstuurd' kan worden en er een nieuwe start voor deze record.

Kost wel aardig wat berekeningen in je applicatie, true to that...

Acties:
  • 0 Henk 'm!

  • ToMaSZ
  • Registratie: Januari 2000
  • Laatst online: 07:58
Blackbird-ce schreef op zondag 06 januari 2008 @ 14:20:
Ik zou dit zelf, indien mogelijk, niet uitvoeren in de query zelf maar alle resultaten te sorteren op (postcode, huisnr). Vervolgens in de applicatie de vorige combinatie (postcode, huisnr) bijhouden en vergelijken met de huidige record. De applicatie kan dan beslissen of de naam van de huidige record moet worden toegevoegd aan het etiketje, of dat de vorige 'verstuurd' kan worden en er een nieuwe start voor deze record.

Kost wel aardig wat berekeningen in je applicatie, true to that...
Ik zou het inderdaad in het php-script kunnen doen (voor mij makkelijker), maar het is een onderdeel van een lijsten-tool waarin heel veel verschillende lijsten kunnen worden gegenereerd (kolommen kiezen over meerdere tabellen (functie-gegevens, byzonderheden, kwalificaties, etc.), selcties op leeftijd, onderdeel, sorteervolgordes aangeven etc.). Vandaar in eerste instantie geprobeerd het in de query op te lossen, die is gemakkelijk dynamisch te genereren.
Resultaat is steeds een excelsheet die voor verdere verwerking kan worden gebruikt of een pdf voor wie een uitdraai nodig heeft.
Het samenvoegen in één naamveld zou dan onder een checkbox 'verzendlijst' oid komen te hangen.

Als het niet in de query lukt is opnemen in het script idd optie 2.

[ Voor 7% gewijzigd door ToMaSZ op 06-01-2008 14:27 ]

What the eyes see, and the ears hear, the mind believes...


Acties:
  • 0 Henk 'm!

  • Tanuki
  • Registratie: Januari 2005
  • Niet online
Wat ik zou doen is de adressen in een aparte tabel opslaan (huishoudens bijv).
Dan heb je ook geen dubbele waarden in je database en kun je makkelijker de adressen selecteren.

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?


Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Laatst online: 01-06 22:09
Indien Mysql zie: http://dev.mysql.com/doc/...tml#function_group-concat

Andere databases hebben vast wel een alternatief.

Net effe geprobeerd en dat werkt perfect:
SQL:
1
2
3
4
5
6
SELECT 
   GROUP_CONCAT(CONCAT(voornaam, ' ', achternaam) SEPARATOR ', '), 
   adres, postcode, woonplaats 
FROM gebruikers 
WHERE adres IS NOT NULL 
GROUP BY adres, postcode, woonplaats 

[ Voor 72% gewijzigd door robbert op 06-01-2008 14:40 ]


Acties:
  • 0 Henk 'm!

  • ToMaSZ
  • Registratie: Januari 2000
  • Laatst online: 07:58
robbert schreef op zondag 06 januari 2008 @ 14:35:
Indien Mysql zie: http://dev.mysql.com/doc/...tml#function_group-concat

Andere databases hebben vast wel een alternatief.

Net effe geprobeerd en dat werkt perfect:
SQL:
1
2
3
4
5
6
SELECT 
   GROUP_CONCAT(CONCAT(voornaam, ' ', achternaam) SEPARATOR ', '), 
   adres, postcode, woonplaats 
FROM gebruikers 
WHERE adres IS NOT NULL 
GROUP BY adres, postcode, woonplaats 
_/-\o_
Dit werkt inderdaad perfect! Soms zoek je te moeilijk blijkbaar...
Note to self: Group_concat in tof-lijstje plaatsen! :)

What the eyes see, and the ears hear, the mind believes...

Pagina: 1