2 tabellen en 1 query
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?
Code (php)
1
2
3
4
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
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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
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
Edit:
[/quote]Te laat...
wel een stukje netter
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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
?>
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
?>
Left join lijkt me ook een goed idee gezien het feit dat een fokker meerdere nesten kan hebben (lijkt mij ?)
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.
Ik heb jouw query uitgeschreven:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
?>
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
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.
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')
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.
Gewijzigd op 01/01/1970 01:00:00 door Lissy Pixel
(In het voorbeeld haal ik maar enkele velden op omdat ik geen zin heb om alles uit te schrijven ;))
Code (php)
1
2
3
4
5
6
7
8
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
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)
1
2
3
4
5
6
7
8
9
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
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
@ Blanche : ik ga dit uitwerken en kom er bij je op terug!!! (((((dikke knuffel voor het helpen)))))
Succes, ik ben benieuwd...
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:
Alles OK begrepen?
@ Blanche : Ik heb een testpagina van de query die ik heb gemaakt. Om te kijken 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)
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
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;
?>
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?
Het ziet er wel ok uit overigens.
Code (php)
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
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>';
}
}
?>
// 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?
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
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
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?