Tutorials

MySQL select meerdere tabellen

In deze tutorial wordt uitgelegd hoe je velden selecteert uit meerdere tabellen.

Pagina 1

Selecteren uit meerdere tabellen

Selecteren uit meerdere tabellen in MySQL is vrij simpel. Het lijkt chaotisch en moeilijk, maar dat is het niet. Om iets te selecteren uit een MySQL database gebruik je normaal:

<?
$sql = "SELECT veld1,veld2,veld3 FROM tabel_naam WHERE veld1 = 'waarde'";
$res = mysql_query($sql);
?>

Wanneer je iets wil gaan selecteren uit meerdere tabellen, geef je elke tabel een extra naam, waardoor je bijvoorbeeld het veld 'id' wat in meerdere tabellen voorkomt kunt identificeren. Je kunt namelijk niet zeggen van, ik wil 'id' als je uit meerdere tabellen selecteert. Hierdoor weet MySQL niet uit welke tabel je het veld 'id' wilt selecteren.

De velden (kolommen) die je selecteert wanneer je iets selecteert uit meerdere tabellen, moet dus dezelfde voornaam hebben als de naam van de tabel.

Het klinkt allemaal erg chaotisch en moeilijk, maar ik ga je in het volgende hoofdstukken praktische voorbeelden geven waardoor het makkelijk wordt te begrijpen.
Pagina 2

Voorbereiding

Wil je ook in de praktijk meedoen met dit voorbeeld? Maak dan de volgende tabellen aan:

<?
CREATE TABLE personen (
id int(11) not null auto_increment primary key
, naam varchar(30) not null
);

CREATE TABLE leeftijden (
id int(11) auto_increment primary key
, leeftijd int(3) not null
, tid int(11) not null
);
?>

Zet hier de volgende records in:

<?
INSERT INTO personen SET id = '', naam = 'Bas Kreleger';
INSERT INTO leeftijden SET id ='', leeftijd = 19, tid = 1;
?>

In het volgende voorbeeld zal dit in de praktijk worden gebruikt!
Pagina 3

Het echte werk!

Stel je voor, je hebt twee tabellen. Een tabel genaamd 'personen' en een tabel genaamd 'leeftijden'. De tabel 'personen' bevat de volgende velden:

- id nummer
- een naam

De tweede tabel, de tabel 'leeftijden' bevat de volgende kolommen:

- id nummer
- leeftijd
- tid (een id nummer wat overeenkomt met een id nummer uit de tabel 'Personen')

Je wil nu bijvoorbeeld de naam van iemand weten met bijbehorende leeftijd. Normaal zou je iets doen zoals dit:

Dit voorbeeld heeft geen specifieke checks of een naam bestaat, of het id nummer wel nummeriek is enz. Deze tutorial gaat in principe alleen om het selecteren uit meerdere tabellen!!

<?
//--- het unieke id nummer van een persoon
$id = 1;

//--- selecteer de naam uit de database
$sql = "SELECT naam FROM personen WHERE id = " . $id;
$res = mysql_query($sql);
$naam = mysql_result($res, 0);

//--- nu zou je denken, ik wil ook de leeftijd, dus nog maar een query!
$sql = "SELECT leeftijd FROM leeftijden WHERE tid = " . $id;
$res = mysql_query($sql);
$leeftijd = mysql_result($res, 0);

//--- echo de resultaten
echo "De persoon: " . $naam . " is " . $leeftijd . " jaar oud.";

/*
mogelijke output:
De persoon: Bas Kreleger is 19 jaar oud.
*/
?>

Wat je ziet, is twee queries. Eén query die de naam ophaalt, en één query die de leeftijd ophaalt.

Je kunt dit ook in één querie doen, gebruik makend van het selecteren uit meerdere tabellen.

Voorbeeld: Nogmaals, geen checks, gaat alleen om de SQL codes!

<?
//--- het unieke id nummer van een persoon
$id = 1;

//--- selecteer de naam + leeftijd uit de database
$sql = "SELECT t1.id, t1.naam, t2.leeftijd, t2.tid FROM ";
$sql .= "personen AS t1, leeftijden AS t2 ";
$sql .= "WHERE t1.id = " . $id . " AND t2.tid = " . $id;
$res = mysql_query($sql);
$row = mysql_fetch_array($res);

//--- echo de resultaten
echo "De persoon: " . $row['naam'] . " is " . $row['leeftijd'] . " jaar oud.";

/*
mogelijke output:
De persoon: Bas Kreleger is 19 jaar oud.
*/
?>

Uitleg hierover in het volgende hoofdstuk!
Pagina 4

Het praktische voorbeeld ontleden

Het ging om het volgende voorbeeld:

<?
//--- het unieke id nummer van een persoon
$id = 1;

//--- selecteer de naam + leeftijd uit de database
$sql = "SELECT t1.id, t1.naam, t2.leeftijd, t2.tid FROM ";
$sql .= "personen AS t1, leeftijden AS t2 ";
$sql .= "WHERE t1.id = " . $id . " AND t2.tid = " . $id;
$res = mysql_query($sql);
$row = mysql_fetch_array($res);

//--- echo de resultaten
echo "De persoon: " . $row['naam'] . " is " . $row['leeftijd'] . " jaar oud.";

/*
mogelijke output:
De persoon: Bas Kreleger is 19 jaar oud.
*/
?>

Nu stukje voor stukje:

We halen het id nummer en de naam op uit de eerste tabel. Als 'extra' naam hebben we deze tabel 't1' genoemd. Het is wat verwarrend omdat je nog helemaal niets hebt benoemd, maar gewoon vanaf t1 selecteert. Dat is helemaal waar. De benamingen t1 en t2 komen de regel hierna. Dit is wanneer we de tabellen een 'extra' naam gaan geven, maar van te voren moet je deze dus eerst gebruiken om MySQL te vertellen welk veld uit welke tabel geselecteerd moet worden.

t1.id = personen - veld id
t2.naam = personen - veld naam
t2.leeftijd = leeftijden - veld leeftijd
t2.tid = leeftijden - veld tid

<?
$sql = "SELECT t1.id, t1.naam, t2.leeftijd, t2.tid FROM ";
?>

Nu geven we de tabellen een extra naam. Deze naam wordt dus t1 en t2. De tabel personen noemen we t1, en de tabel leeftijden noemen we t2. Je ziet dat dit overeenkomt met de velden hiervoor geselecteerd.

We zeggen hier: tabel naam 'personen' AS t1
Dit betekent: tabel personen geven we als alias de naam t1. Dit gebeurt hetzelfde bij de tabel leeftijden die t2 wordt genoemd.

<?
$sql .= "personen AS t1, leeftijden AS t2 ";
?>

Nu het 'WHERE' gedeelte. We willen uit de tabel personen (t1) de 'naam' waar de 'id' 1 is. Uit tabel leeftijden (t2) de 'leeftijd' waar 'tid' 1 is.

We zeggen WHERE t1.id.. Dit betekent WAAR tabel1 (personen) het veld 'id' het nummer 1 heeft.
We zeggen hierna: WHERE t2.tid.. Dit betekent WAAR tabel2 (leeftijden) het veld 'tid' het nummer 1 heeft.

<?
$sql .= "WHERE t1.id = " . $id . " AND t2.tid = " . $id;
?>

Omdat je van te voren de veldnamen 'naam' en 'leeftijd' hebt geselecteerd:

<?
$sql = "SELECT t1.id, t1.naam, t2.leeftijd, t2.tid FROM ";
?>

Kun je deze veldnamen dus ook opvragen. Dit kun je doen met dezelfde benaming. Dus t1.naam en t2.leeftijd. Dit werkt als volgt:

<?
$sql = "De behandelde SQL code";
$res = mysql_query($sql);
$row = mysql_fetch_array($res);

echo "Naam: " . $row['naam'] . "<br />";
echo "Leeftijd: " . $row['leeftijd'] . "<br />";
?>

Als je in PHPMyAdmin nou wilt kijken wat hij nou precies doet en hoe het eruit ziet, typ dan de volgende code in je SQL window:

<?
SELECT t1.id, t1.naam, t2.leeftijd, t2.tid FROM personen AS t1, leeftijden AS t2 WHERE t1.id = 1 AND t2.tid = 1;
?>

Je krijgt als het goed is het volgende te zien:



Bekijk het volgende hoofdstuk wanneer je wil weten wat je moet doen wanneer er dubbele kolomnamen in het spel zijn.
Pagina 5

Dubbele kolom namen

Wat nou als je een id nummer moet hebben van de kolom personen en de kolom leeftijden? Dan heb je toch een dubbele benaming? Dat klopt! Wanneer je het volgende doet:

<?
$sql = "SELECT t1.id, t2.id FROM personen AS t1, leeftijden AS t2 ORDER BY t1.id LIMIT 0,1";
$res = mysql_query($sql);
$row = mysql_fetch_array($res);
?>

Door bovenstaande query uit te voeren zul je het volgende resultaat krijgen (in PHPMyAdmin):



Dit houdt in dat je twee id nummers hebt! Dus als je vervolgens:

<?
echo $row['id'];
?>

Doet, zul je 1 van de twee id nummers krijgen. Je kunt niet nog een keer $row['id'] oproepen, want dan krijg je weer het zelfde resultaat. Er zijn twee mogelijkheden om op te lossen, 1 goede, en 1 minder goede.

Wat je zou moeten doen, is beide kolomnamen een alias geven. Zie onderstaand voorbeeld. Hier wordt gezegd: t1.id AS pers_id, t2.id AS leeftijd_id. Dit houdt in dat het id nummer uit de tabel personen straks op te vragen is via de alias 'pers_id' en het id nummer uit de tabel leeftijden op te vragen is via de alias 'leeftijd_id'.

<?
$sql = "SELECT t1.id AS pers_id, t2.id AS leeftijd_id FROM personen AS t1, leeftijden AS t2 ORDER BY t1.id LIMIT 0,1";
$res = mysql_query($sql);
$row = mysql_fetch_array($res);
?>

Wanneer je dit zou uitvoeren, zou je het volgende resultaat kunnen verwachten:



Je kunt deze hierna als volgt benaderen:

<?
echo "id nummer uit personen tabel: " . $row['pers_id'] . "<br />";
echo "id nummer uit leeftijden tabel: " . $row['leeftijd_id'] . "<br />";
?>

Je kunt het ook anders oplossen. Dit is een minder goede oplossing maar ik wil hem je toch geven. Dit is eigenlijk alleen handig wanneer je slechts 2 dubbele kolommen benaderd. Wanneer er meer kolommen in het spel zijn zou ik 'mysql_fetch_array()' gebruiken omdat dit een stuk overzichtelijker is. Het volgende voorbeeld maakt gebruik van 'mysql_result()'.

<?
$sql = "SELECT t1.id, t2.id FROM personen AS t1, leeftijden AS t2 ORDER BY t1.id LIMIT 0,1";
$res = mysql_query($sql);

echo "id nummer uit personen tabel: " . mysql_result($res, 0) . "<br />";
echo "id nummer uit leeftijden tabel: " . mysql_result($res, 0, 1) . "<br />";
?>

Zo kan het dus ook. Het is slechts 1 regel korter. In dit geval is het opzich wel handig om te gebruiken, alleen gaat mijn voorkeur uit naar de eerste methode. De dubbel benaamde kolomnamen een alias geven.

Ik hoop dat je wat aan deze tutorial hebt gehad, mocht je vragen hebben over de tutorial, laat een reactie achter. Heb je vragen over een andere query die buiten deze tutorial staat? Vraag dit dan op het forum!

Reacties

0
Nog geen reacties.