2 tabellen en 1 query

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 3 volgende »

Lissy Pixel

Lissy Pixel

05/10/2006 19:05:00
Quote Anchor link
Ik heb nu twee tabellen waar ik happy mee ben.
Dit zijn twee queries die ik heb gemaakt:

// de is query voor de tabel: beardie_fokkers
$sql = "SELECT fokker_id, fokker_kennelnaam, fokker_naam, fokker_telnr, fokker_email, fokker_website FROM beardie_fokkers";

// de query voor de tabel: beardie_nest
$sql = "SELECT nest_id, nest_geboortedatum, nest_nest_moeder, nest_vader, nest_geslacht_kleur, nest_betaald FROM beardie_nest";

Wat ik mis is dat ze beide aan elkaar worden gemaakt (gelinkt) tot 1 query en ik weet niet hoe dit te doen. Dus dat ik uiteindelijk 1 query krijg welke ùit beide tabellen de velden haalt zoals in beide queries vraag.

Uitgeschreven met de bijbehorende velden van betreffende tabellen:
$sql = 'SELECT fokker_kennelnaam, fokker_naam, fokker_telnr, fokker_email, fokker_website FROM beardie_fokkers WHERE fokker_id=nest_id';

Maar ik weet dat dit niet goed gaat maar zie even niet hoe op te lossen. Wie weet raad?
 
PHP hulp

PHP hulp

18/11/2024 14:35:38
 
Robert Deiman

Robert Deiman

05/10/2006 19:23:00
Quote Anchor link
Als je fokker_id gelijk is aan het nest_id (wat betekend dat een fokker maar 1 nest kan hebben) dan kan het bijvoorbeeld zo:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT bn.nest_id, bn.nest_geboortedatum, bn.nest_nest_moeder, bn.nest_vader, bn.nest_geslacht_kleur, bn.nest_betaald,
       bf.fokker_id, bf.fokker_kennelnaam, bf.fokker_naam, bf.fokker_telnr, bf.fokker_email, bf.fokker_website
  FROM beardie_nest bn, beardie_fokkers bf
  WHERE bn.nest_id = bf.fokker_id
Gewijzigd op 01/01/1970 01:00:00 door Robert Deiman
 
Joren de Wit

Joren de Wit

05/10/2006 19:25:00
Quote Anchor link
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
    f.fokker_id,
    f.fokker_kennelnaam,
    f.fokker_naam,
    f.fokker_telnr,
    f.fokker_email,
    f.fokker_website
    n.nest_id,
    n.nest_geboortedatum,
    n.nest_nest_moeder,
    n.nest_vader,
    n.nest_geslacht_kleur,
    n.nest_betaald
FROM
    beardie_fokkers AS f,
    beardie_nest AS n
WHERE
    f.fokker_id = n.nest_id


Edit:
Te laat...
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Klaasjan Boven

Klaasjan Boven

05/10/2006 19:29:00
Quote Anchor link
[quote=Blanche schreef op 05.10.2006 19:25

Edit:
Te laat...
[/quote]

wel een stukje netter
 
Robert Deiman

Robert Deiman

05/10/2006 19:30:00
Quote Anchor link
Trouwens, lees dit ook eens, je kan ook een left join gebruiken, zoals hier staat aangegeven op wikipedia.
Dit werkt ook perfect, heb het zelf ooit ergens bij gebruikt ;)

http://nl.wikipedia.org/wiki/Select_(SQL)
Gewijzigd op 01/01/1970 01:00:00 door Robert Deiman
 
Lissy Pixel

Lissy Pixel

05/10/2006 19:32:00
Quote Anchor link
Helder en voor ik dit echt snap heb ik het dan goed dat dit allemaal hernoemde velden zijn en je krijgt wat in de tabellen staat?
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
<?php
SELECT
    f.fokker_id,
    f.fokker_kennelnaam,
    f.fokker_naam,
    f.fokker_telnr,
    f.fokker_email,
    f.fokker_website
    n.nest_id,
    n.nest_geboortedatum,
    n.nest_nest_moeder,
    n.nest_vader,
    n.nest_geslacht_kleur,
    n.nest_betaald
FROM
    beardie_fokkers AS f,
    beardie_nest AS n
WHERE
    f.fokker_id = n.nest_id
?>
 
Klaasjan Boven

Klaasjan Boven

05/10/2006 19:34:00
Quote Anchor link
Left join lijkt me ook een goed idee gezien het feit dat een fokker meerdere nesten kan hebben (lijkt mij ?)
 
Robert Deiman

Robert Deiman

05/10/2006 19:35:00
Quote Anchor link
lissy:
Helder en voor ik dit echt snap heb ik het dan goed dat dit allemaal hernoemde velden zijn en je krijgt wat in de tabellen staat?


Klopt.. Maar met een INNER JOIN (left join) is het eigenlijk nog netter, maar dat zou je maar eens moeten kijken of je daaruit komt.. Ik wil je ook wel helpen hoor, maar ik denk dat de uitleg op de link in mijn vorige post ook goede uitleg geeft.
 
Lissy Pixel

Lissy Pixel

05/10/2006 19:38:00
Quote Anchor link
@ Robert: Ja graag hulp met innerjoin want dit heb ik dus nog nooit gedaan en inderdaad 1 fokker kan twee nesten hebben.

Ik heb jouw query uitgeschreven:

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
<?php
SELECT
bn.nest_id,
bn.nest_geboortedatum,
bn.nest_nest_moeder,
bn.nest_vader,
bn.nest_geslacht_kleur,
bn.nest_betaald,
bf.fokker_id,
bf.fokker_kennelnaam,
bf.fokker_naam,
bf.fokker_telnr,
bf.fokker_email,
bf.fokker_website
FROM
beardie_nest bn, beardie_fokkers bf
WHERE
bn.nest_id = bf.fokker_id
?>


Ik heb dit gevonden http://nl.wikipedia.org/wiki/Select_%28SQL%29:

SELECT * FROM tabel1 INNER JOIN tabel2 ON tabel1.veld = tabel2.veld
Dus bij mij:
SELECT * FROM beardie_fokkers INNER JOIN beardie_nest ON beardie_fokkers.veld = beardie_nest.veld

Hoe nu verder? Wat zet ik neer bij veld? Ik heb geen idee...
Gewijzigd op 01/01/1970 01:00:00 door Lissy Pixel
 
Joren de Wit

Joren de Wit

05/10/2006 20:03:00
Quote Anchor link
@Robert: een left join is geen inner join, maar juist een outer join.

Bij een inner join worden alleen de velden geselecteerd waarbij er bij beide tabellen een match is. Bij een left join worden alle velden van de ene (linker) tabel geselecteerd, ongeacht of er matches zijn met de tweede tabel.

@Lissy: Zou je misschien je database structuur even weer kunnen geven, dan is het wat duidelijker.
 
Lissy Pixel

Lissy Pixel

05/10/2006 20:07:00
Quote Anchor link
@ Blanche :
Tabel beardie_fokker
fokker_id int(11)
fokker_kennelnaam varchar(255)
fokker_plaatje varchar(255)
fokker_naam varchar(150)
fokker_adres varchar(255)
fokker_postcode varchar(10)
fokker_woonplaats varchar(255)
fokker_telnr varchar(15)
fokker_email varchar(100)
fokker_website varchar(50)
fokker_bericht text
fokker_inschrijfdatum datetime
fokker_aanmeld_ip varchar(15)

Tabel beardie_nest
nest_id int(11)
nest_geboortedatum date
nest_moeder varchar(255)
nest_vader varchar(255)
nest_geslacht_kleur varchar(255)
nest_betaald enum('ja', 'nee')
 
Joren de Wit

Joren de Wit

05/10/2006 20:13:00
Quote Anchor link
Aangezien 1 fokker meerdere nesten kan hebben, mis ik in de tabel beardie_nest de kolom fokker_id.

Zoals je je tabellen nu hebt, zijn ze compleet onafhankelijk van elkaar waardoor je ook niet met joins kunt werken.

ps. Persoonlijk zou ik ook de prefixen fokker_ en nest_ weglaten, aangezien je daar in je queries de tabelnamen of aliassen voor gebruikt.
 
Lissy Pixel

Lissy Pixel

05/10/2006 20:18:00
Quote Anchor link
@ Blanche : helder en heb er nu in staan nest_fokker_id (ik laat dit even zo anders snap ik er zelf niets meer van en wanneer me alles echt duidelijk is verander ik het) maar nu ben ik weer terug naar af lijkt me want ik weet nu niet meer hoe de query wel zou moeten?
Gewijzigd op 01/01/1970 01:00:00 door Lissy Pixel
 
Joren de Wit

Joren de Wit

05/10/2006 20:26:00
Quote Anchor link
OK, stel je hebt een tabel met fokkers. Met een INNER JOIN zou je alle records op kunnen halen van fokkers die ook daadwerkelijk een of meerdere nesten hebben.

(In het voorbeeld haal ik maar enkele velden op omdat ik geen zin heb om alles uit te schrijven ;))

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
SELECT
    f.fokker_naam,
    n.nest_id
FROM
    beardie_fokker AS f
    beardie_nest AS n
WHERE
    f.fokker_id = n.nest_fokker_id


Maar stel nu dat je gegevens van alle fokkers op wilt halen, dus ook van degene die nog geen nestje hebben. Je gebruikt dat een LEFT JOIN:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
SELECT
    f.fokker_naam,
    n.nest_id
FROM
    beardie_fokker AS f
LEFT JOIN
    beardie_nest AS n
ON
    f.fokker_id = n.nest_fokker_id


Op W3Schools staat een vrij duidelijke uitleg van het verschil tussen een INNER en OUTER (LEFT) JOIN.

Edit:
Kleine aanpassing n.a.v een edit van Lissy's post
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Lissy Pixel

Lissy Pixel

05/10/2006 20:28:00
Quote Anchor link
@ Blanche : ik ga dit uitwerken en kom er bij je op terug!!! (((((dikke knuffel voor het helpen)))))
 
Joren de Wit

Joren de Wit

05/10/2006 20:33:00
Quote Anchor link
Succes, ik ben benieuwd...
 
Lissy Pixel

Lissy Pixel

06/10/2006 10:34:00
Quote Anchor link
@ Blanche : Ik heb een testpagina van de query die ik heb gemaakt. Om te kijken KLIK HIER

Wat de bedoeling is en wanneer ik alles naar behoren heb begrepen is dat de fokker(s) (het is er nu maar 1 want de database is gevuld met 1 fokker met 1 nest) worden laten zien die nest(en) hebben.

Hier de code:
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
24
25
26
27
28
29
30
31
32
33
<?php
session_start();

// Zo begin je met een nieuw script!
ini_set ('display_errors', 1);
error_reporting (E_ALL);

// de query
$sql = "
SELECT
    f.id,
    f.kennelnaam,
    f.naam,
    f.telnr,
    f.email,
    f.website
    n.id,
    n.fokker_id
    n.geboortedatum,
    n.moeder,
    n.vader,
    n.geslacht_kleur,
    n.betaald
FROM
    beardie_fokkers AS f,
    beardie_nest AS n
WHERE
    f.id = n.id
    "
;

$res = mysql_query($sql);
echo $sql;
?>


Alles OK begrepen?
 
Robert Deiman

Robert Deiman

06/10/2006 10:48:00
Quote Anchor link
Er is nu maar 1 fokker, en 1 nest, maar je echo't nu de query, letterlijk zoals die in je code staat...
Het ziet er wel ok uit overigens.
 
Lissy Pixel

Lissy Pixel

06/10/2006 10:52:00
Quote Anchor link
@ Robert : ja en ik loop ook weer vast want hoe laat je dit nu zien... Ik had dit:

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
// de query
$sql = "
SELECT
    f.id,
    f.kennelnaam,
    f.naam,
    f.telnr,
    f.email,
    f.website
    n.id,
    n.fokker_id
    n.geboortedatum,
    n.moeder,
    n.vader,
    n.geslacht_kleur,
    n.betaald
FROM
    beardie_fokkers AS f,
    beardie_nest AS n
WHERE
    f.id = n.id
    "
;

$res = mysql_query($sql);

if ($res && mysql_num_rows($res) >= 1)
    {

        while ($row = mysql_fetch_array($res))
        {

            // de output
            $fullpath        = $imgpath . $row['id'].'.jpg';
            $kennelnaam        = $row['kennelnaam'];
            $naam            = $row['naam'];
            $telnr            = $row['telnr'];
            $email            = $row['email'];
            $website        = $row['website'];
            $geboortedatum    = $row['geboortedatum'];
            $moeder            = $row['moeder'];
            $vader            = $row['vader'];
            $geslacht_kleur    = $row['geslacht_kleur'];
            $betaald        = $row['betaald'];
            
            echo '<p align=center><br /><img src="../../images/div1.gif" alt=sbcc>';
            echo '<br />';
            
            echo '<table width=500 border=2 cellpadding=1 cellspacing=1 class= teksttabel>';
            echo '<tr><td>';
            //echo '<p><image src="' . $fullpath . '"><br />';
            echo '<p><a href="' . $row['website'] . "\" target=\"_blank\">" . '<image src="' . $fullpath . '"></a>';
            echo '</td>';
            //echo '<td><p><br /><b>' . $kennelnaam . '</b><br />';
            echo '<td><p><a href="' . $row['website'] . "\" target=\"_blank\"><b>" . $kennelnaam . '</b></a><br />';
            echo '<p>' . $naam . '<br />';
            echo 'tel.nr: ' . $telnr . '<br />';
            //echo 'email: ' . $email . '<br />';
            echo 'email: <a href=mailto:' . $email . '>' . $naam . '</a><br />';
                        
            echo 'site: <a href="' . $row['website'] . "\" target=\"_blank\">" . $row['kennelnaam'] . '</a><br />';
            //echo '<br /><img src="../../images/div1.gif" alt=sbcc>';
            echo '</td></tr></table>';
            echo '</p>';
        }
    }

?>


Maar dat gaat niet goed en ik weet niet waarom?
 
Joren de Wit

Joren de Wit

06/10/2006 10:57:00
Quote Anchor link
Het klopt nog niet helemaal. In je WHERE clause koppel je de tabellen nu namelijk op het punt waar het id van de fokker gelijk is aan het id van een nest. Je zult dan altijd maar 1 resultaat krijgen aangezien het id van een nest uniek is...

Sterker nog: het zelfs zo kunnen zijn dat je een nest selecteert dat niet eens bij die fokker hoort.

Je hebt in je tabel beardie_nest nu ook een fokker_id staan. Je zult dus moeten hebben
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
WHERE
    f.id = n.fokker_id


Op deze manier selecteer je de fokkers uit de eerste tabel met alle bijbehorende nesten uit de tweede tabel. Als een fokker nu nog geen nest heeft, wordt hij ook niet geselecteerd.

ps. Mocht je nu ook de fokkers selecteren die nog geen nest hebben, dan kun je dat doen met behulp van een LEFT JOIN. Mocht dat het geval zijn, dan wil ik je wel even een voorbeeldje geven...
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Robert Deiman

Robert Deiman

06/10/2006 11:13:00
Quote Anchor link
lissy:
Maar dat gaat niet goed en ik weet niet waarom?


Ik ook niet Lissy, wat gaat er niet goed, geeft die helemaal niets weer, of geeft die wel wat weer maar niet goed?
 

Pagina: 1 2 3 volgende »



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.