variable nr velden van meerder tabelen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jan R

Jan R

22/09/2014 09:53:50
Quote Anchor link
Hoi,

ik heb meerdere tabellen welke ik wil samenvoegen in 1 query.
Tabel 1 is een simpele lijst met de namen en adressen. Hier moet ik alle records van hebben

Leden:
id autonummer
Naam, voornaam,... varchar

Tabel 2 zijn activiteiten Hier moeten dus alle activiteiten van terug komen
ActList:
ID autonummer
datum date
ActNaam varchar

Er is een tussenliggende tabel welke bepaald wie meedoet aan welke activiteit
Activiteiten:
Lid int(11) NOT NULL,(id van het lid)
DoetMee tinyint(1) NOT NULL,
Act int(11) NOT NULL(id van de activiteit)

Hoe kan ik een lijst hebben van Alle leden met alle activiteiten waaraan ze wel of niet meedoen.

Jan
Met deze code maak ik een lijst van mijn leden
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT
    ID,
    trim(voornaam),
    trim(achternaam),
    trim(straat),
    trim(huisnummer),
    postcode as pc,
    gemeente as stad,
    DATE_FORMAT(geboortedatum, "%d-%m-%Y") AS datum,
    DATE_FORMAT(LidSinds, "%d-%m-%Y") AS LidSinds,
    ShowAdres,
    showTel,
    ShowEmail,
    functie,
    DATE_FORMAT(NOW(), "%Y") - DATE_FORMAT(geboortedatum, "%Y") - (DATE_FORMAT(NOW(), "00-%m-%d") < DATE_FORMAT(geboortedatum, "00-%m-%d")) AS age,
    land,
    actief
FROM leden;
 
PHP hulp

PHP hulp

16/11/2024 20:47:48
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

22/09/2014 10:38:07
Quote Anchor link
Met een cross join 'hang' je alle activiteiten aan alle leden, daarna kan je met een left join op activiteiten bepalen of er wel of niet meegedaan wordt, of het nog niet bekend is (mijn interpretatie van jouw bedoeling met de doetmee kolom)

Ingekort:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
    l.achternaam,
    al.actnaam,
    CASE a.doetmee
        WHEN 1 THEN 'Ja'
        WHEN 0 THEN 'Nee'
        ELSE 'onbekend' END doetieut
FROM
    Leden l
CROSS JOIN
    ActList al
LEFT JOIN
    Activiteiten a
    ON l.id = a.lid AND al.id = a.act
Gewijzigd op 22/09/2014 10:40:55 door Ger van Steenderen
 
Jan R

Jan R

22/09/2014 10:51:24
Quote Anchor link
Ger,

Bedankt voor het snelle antwoord.
resultaat is er echter nog niet. ik heb 1 lijn per lid/activiteit.
Ik zou 1 rec moeten hebben per Lid
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
Naam    |Act1    |act2
Jan    |Ja    |Nee
piet    |Jan    |Ja
Joris    |Nee    |Ja


Eventueel aangevuld met nog meer activiteiten.
Het aantal activiteiten kan 0 tot oneindig zijn. In de praktijk ±5

Jan
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

22/09/2014 12:58:16
Quote Anchor link
Er zijn oplossingen voor om het in de query te doen, maar persoonlijk geef ik er de voorkeur aan om het in php te doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$pointer
= '';
$counter = 0;
$head = '';
$body = '<tbody>';
$tr = '';
while($row = $pdo->fetch(PDO::FETCH_ASSOC)) {
    if($row['achternaam'] != $pointer) {
        $counter++;
        if($counter == 1) {
            $head = '<thead><tr><td>Naam<td>';
        }

        $pointer = $row['achternaam'];
        $body .= $tr . '<tr><td>' . $pointer . '<td>';
        $tr = '</tr>';
    }

    if ($counter == 1) {
        $head .= '<td>' . $row['actnaam'] . '</td>';
    }

    $body .= '<td>' . $row['doetieut'] . '</td>';
}

echo '<table>' . $thead . '</tr></thead>' . $tbody . '</tr></tbody></table>';
?>
Gewijzigd op 22/09/2014 12:59:01 door Ger van Steenderen
 
Jan R

Jan R

22/09/2014 13:43:18
Quote Anchor link
Ok bedankt. Dan laat ik het ook in PHP. Ik wou het gewoon wat versnellen.

Jan
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.