Hoe lees en schrijf ik in een genormaliseerde database.
Zou iemand mij eens een query voor willen doen hoe deze 'n' kan worden gelezen of worden weg geschreven?:
SELECT * FROM tabelnaam WHERE kollomnaam = waarde
Youre welcome
Waarom die * gebruiken?
Dit word eerder afgeraden dan aan gemoedigd.
Je kan beter je Query voluit noteren.
Want zo haal je de gegevens op die je nodig hebt.
Als je * gebruikt en je hebt 10 velden waar je in je Query maar 3 nodig hebt.
Dan laad je wel 7 onnodige velden in die je nergens in je script wilt gebruiken.
Gewijzigd op 27/02/2012 11:09:06 door Frank WD
die 4 -ids die ik heb zijn dus niet elk 1 tabel, maar zijn elk een veld?
en is dan elke keer dat ik zo'n nieuw rijtje begin de naam van dat rijtje een tabel?
bv
is Boeken dan een tabel?
Overigens, (ff compleet offtopic) koos, check je PM ff :)
Is het dan niet eerder zo?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
+----------+
| boeken |
+----+-----+
| id | Lid |
+----+-----+
| 1 | a |
| 2 | z |
| 3 | r |
| 4 | n |
| 5 | j |
| 6 | f |
+----+-----+
| boeken |
+----+-----+
| id | Lid |
+----+-----+
| 1 | a |
| 2 | z |
| 3 | r |
| 4 | n |
| 5 | j |
| 6 | f |
+----+-----+
En ik heb een vermoeden dat Koos iets anders bedoelt met n,j en f.
Maar dat is voor mij even gokken hoor en mocht met die 3 waarden iets anders bedoelt worden dan zal het ongeveer zo moeten zijn.
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
+----------------+
| boeken |
+----+-----+-----+
| id | Lid | ?? |
+----+-----+-----+
| 1 | a | n |
| 2 | z | j |
| 3 | r | f |
+----+-----+-----+
| boeken |
+----+-----+-----+
| id | Lid | ?? |
+----+-----+-----+
| 1 | a | n |
| 2 | z | j |
| 3 | r | f |
+----+-----+-----+
Alleen klinkt mij dit ook niet echt logich als ik eerlijk ben.
Want waarom zou je 2x een id gebruiken als dit niet nodig is? Of dit moet een eerste tabel zijn van een groter geheel.
Gewijzigd op 27/02/2012 11:36:10 door Frank WD
Zijn dit titels van boeken zijn dit auteurs enz....?
Want zoals je het nu op schrijft heb je dus 4 tabellen met elk 2 velden.
Ofwel elk blokje is : 1 tabel + 2 velden waaran 1 id veld en 1 r veld. waarvan de velden 3 rows hebben.
Misschien geeft deze iets meer duidelijkheid voor jou.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
+--------------------------+
| boeken |
+---+-------------+--------+
|id | titel | auteur |
+---+-------------+--------+
| 1 |Harry Potter | Koos |
+---+-------------+--------+
| boeken |
+---+-------------+--------+
|id | titel | auteur |
+---+-------------+--------+
| 1 |Harry Potter | Koos |
+---+-------------+--------+
Gewijzigd op 27/02/2012 12:11:17 door Frank WD
Maar wat wil je nu echt. Want op basis van je vraag in de eerste post is het antwoord al gegeven in de tweede post (met als opmerking dat je SELECT * niet zou moeten gebruiken). Maar ergens heb ik het idee dat dat helemaal niet is waar je naar op zoek bent, dus misschien handig om wat duidelijker te zijn.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT * FROM tabelnaam(LEDEN) WHERE rijnaam = id-nummer
AND
SELECT * FROM tabelnaam(BIBLIOTHEKEN) WHERE rijnaam = id-nummer
AND
SELECT * FROM tabelnaam(ZALEN) WHERE rijnaam = id-nummer
AND
SELECT * FROM tabelnaam(BOEKEN) WHERE rijnaam = id-nummer
AND
SELECT * FROM tabelnaam(BIBLIOTHEKEN) WHERE rijnaam = id-nummer
AND
SELECT * FROM tabelnaam(ZALEN) WHERE rijnaam = id-nummer
AND
SELECT * FROM tabelnaam(BOEKEN) WHERE rijnaam = id-nummer
(ik was er al bang voor maar dat boeken was een verkeerd voorbeeld want de boekeigenschappen zijn niet afhankelijk van lid, bibliotheek, of zaal. In mijn situatie zijn die gegevens wel allemaal afhankelijk van die verschillende ids, dus for the sake of argument..;)
2 - geen * gebruiken, maar kolommen benoemen
3 - Wat wil je met die AND tussen de SELECTS. Dat kan niet, maar ik kan niet direct een antwoord geven hoe dan wel, omdat ik niet weet wat je nu precies wilt hebben....
Tabel 1 lid
Tabel 2 bibliotheek
Tabel 3 zaal
Tabel 4 boek
En dit wil je dan samen koppelen. Want dat begrijpt ik uit de verschillende id's bij de eerste 4. Als je het bedoelt zoals ik heb snap dan zal het zijn.
tabel boek
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
+-------------------------------------------------+
| boek |
+---+-----+-----+-----+-----+-------+-------+-----+
|id |l_id |b_id |z_id | naam |auteur |genre|
+---+-----+-----+-----+-------------+-------+-----+
| 1 | 1 | 1 | 1 |Harry Potter | Koos | En |
+---+-------------+---+-------------+-------+-----+
| boek |
+---+-----+-----+-----+-----+-------+-------+-----+
|id |l_id |b_id |z_id | naam |auteur |genre|
+---+-----+-----+-----+-------------+-------+-----+
| 1 | 1 | 1 | 1 |Harry Potter | Koos | En |
+---+-------------+---+-------------+-------+-----+
tabel lid
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
+-----------+
| lid |
+-----+-----+
|l_id |naam |
+-----+-----+
| 1 |Koos |
+-----+-----+
| lid |
+-----+-----+
|l_id |naam |
+-----+-----+
| 1 |Koos |
+-----+-----+
tabel bibliotheek
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
+------------------------------+
| bibliotheek |
+-----+---------------+--------+
|b_id | naam | plaats |
+-----+---------------+--------+
| 1 |Koos lees huis |Utrecht |
+-----+---------------+--------+
| bibliotheek |
+-----+---------------+--------+
|b_id | naam | plaats |
+-----+---------------+--------+
| 1 |Koos lees huis |Utrecht |
+-----+---------------+--------+
Enz............
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
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
+----------------------------------+
| boeken |
+-----+---------+------------------+
| id | lidID | boek |
+-----+---------+------------------+
| 1 | 1 | Kappen |
+-----+---------+------------------+
| 2 | 1 | Harry Potter |
+-----+---------+------------------+
| 3 | 3 | Harry Potter 2 |
+-----+---------+------------------+
+----------------------------------------+
| bibliotheken |
+-----+----------------------------------+
| id | bibliotheek | locatie |
+-----+----------------------------------+
| 1 | bieb 1 | Utrecht |
+-----+----------------------------------+
| 2 | bieb 2 | Amsterdam |
+-----+----------------------------------+
| 3 | bieb 3 | Maarssen |
+-----+----------------------------------+
+-------------+
| leden |
+-----+-------+
| id | name |
+-----+-------+
| 1 | jan |
+-----+-------+
| 2 | kees |
+-----+-------+
| 3 | gert |
+-----+-------+
| boeken |
+-----+---------+------------------+
| id | lidID | boek |
+-----+---------+------------------+
| 1 | 1 | Kappen |
+-----+---------+------------------+
| 2 | 1 | Harry Potter |
+-----+---------+------------------+
| 3 | 3 | Harry Potter 2 |
+-----+---------+------------------+
+----------------------------------------+
| bibliotheken |
+-----+----------------------------------+
| id | bibliotheek | locatie |
+-----+----------------------------------+
| 1 | bieb 1 | Utrecht |
+-----+----------------------------------+
| 2 | bieb 2 | Amsterdam |
+-----+----------------------------------+
| 3 | bieb 3 | Maarssen |
+-----+----------------------------------+
+-------------+
| leden |
+-----+-------+
| id | name |
+-----+-------+
| 1 | jan |
+-----+-------+
| 2 | kees |
+-----+-------+
| 3 | gert |
+-----+-------+
Nu heb je al je boeken, al je leden en kun je bijhouden wie welk boek heeft...
Volgende keer als je wat vraagt graag een iets completeren beschrijving, zo is het gewoon gokken.
Uitleg:
Als je dit dan zo ziet is het vrij simpel te begrijpen. Een boek is in bezit van een lid of een bibliotheek, want het kan niet op 2 plekken tegelijk zijn.
Wil je nu alle leden ophalen selecteer je heel simpel door middel van een select statement al je leden.
Voorbeeld
Nu zou je ook nog heel erg graag alle boeken die dat lid in bezit heeft willen hebben. Hiervoor ga je join gebruiken. Geen tweede query, dat is namelijk niet nodig.
Voorbeeld:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
SELECT
l.id,
l.name,
b.boek
FROM
leden AS l
JOIN
boeken AS b
ON
l.id = b.lidID
l.id,
l.name,
b.boek
FROM
leden AS l
JOIN
boeken AS b
ON
l.id = b.lidID
Wil je alle boeken die niet uitgeleend zijn aan een lid hebben? Dan kijk je gewoon waar er geen lidID is ingevuld in je tabel.
Voorbeeld
Ga zo maar verder....
Gewijzigd op 27/02/2012 13:05:37 door Milo S
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
+-------------------------------------------------+
| boek |
+---+-----+-----+-----+-----+-------+-------+-----+
|id |l_id |b_id |z_id | naam |auteur |genre|
+---+-----+-----+-----+-------------+-------+-----+
| 1 | 6 | 3 | 2 |Harry Potter | Koos | En |
+---+-------------+---+-------------+-------+-----+
| boek |
+---+-----+-----+-----+-----+-------+-------+-----+
|id |l_id |b_id |z_id | naam |auteur |genre|
+---+-----+-----+-----+-------------+-------+-----+
| 1 | 6 | 3 | 2 |Harry Potter | Koos | En |
+---+-------------+---+-------------+-------+-----+
Juist.
en dan is de vraag hoe je zo'n waarde opvraagt of wegschrijft.
Als ik in jouw tabel "Boek" bv de naam wil veranderen, wat word dan mijn query?
(overigens ie ik net dat ik toch een handleiding over het hoofd heb gezien, waarschijnlijk't beste als ik die eerst lees ;)
http://www.phphulp.nl/php/tutorial/data-verwerking/multiple-querys-die-je-nodig-hebt-na-normaliseren/483/ )
Gewijzigd op 27/02/2012 12:34:46 door koos jansen
http://www.phphulp.nl/php/tutorial/overig/sql-joins-uitgebreid/479/
Expliciete joins zijn (wat mij betreft in elk geval) vele malen beter dan die impliciete joins die in de tutorial worden gebruikt die jij nu linked hier.
Maar ga dan wel direct door naar de joins tutorial die op de laatste pagina gelinked staat: Expliciete joins zijn (wat mij betreft in elk geval) vele malen beter dan die impliciete joins die in de tutorial worden gebruikt die jij nu linked hier.
Mooi dat het is wat je bedoelt.
Dan heeft mijn glazen bol me niet in de steek gelaten ;)
Zoals Erwin aan gaf even joins door nemen. Hier kan ik je niet zo snel een voorbeeld van geven ivm ik daar nog niet bedreven in ben en zelf veel moet toveren er in.
Alleen beetje van db normaliseren lukt me redelijk.
@Koos, in dat geval moet je nog wat beter normaliseren. Om 2 dingen, in dit geval boeken en leden, aan elkaar te koppelen gebruik je een koppeltabel, zoals je bij milo ziet. En dit doe je ook voor bibliotheken.
In deze situatie heb je geen koppel-tabel nodig. Een lid kan namelijk wel meerdere boeken hebben, maar datzelfde boek niet bij meerdere leden.
Zelfs als je meer van hetzelfde boek zou hebben in 1 bibliotheek is dit zo, ieder boek heeft namelijk altijd zijn eigen nummer.
Ik zit dan nog even met het volgende probleem.
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
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
--------
|a |
--------
|id|a1|a2|
--------
|1 |45|32|
|2 |56|54|
|3 |76|65|
--------
--------
|b |
--------
|id|b1|b2|
--------
|1 |45|32|
|2 |56|54|
|3 |76|65|
--------
--------
|c |
--------
|id|c1|c2|
--------
|1 |45|32|
|2 |56|54|
|3 |76|65|
--------
-----------------
| hoofdindex |
-----------------
|id|a_id|b_id|c_id|
|1 |2 |1 |3 |
|2 |1 |2 |4 |
|3 |4 |1 |3 |
-----------------
|a |
--------
|id|a1|a2|
--------
|1 |45|32|
|2 |56|54|
|3 |76|65|
--------
--------
|b |
--------
|id|b1|b2|
--------
|1 |45|32|
|2 |56|54|
|3 |76|65|
--------
--------
|c |
--------
|id|c1|c2|
--------
|1 |45|32|
|2 |56|54|
|3 |76|65|
--------
-----------------
| hoofdindex |
-----------------
|id|a_id|b_id|c_id|
|1 |2 |1 |3 |
|2 |1 |2 |4 |
|3 |4 |1 |3 |
-----------------
Het opvragen lukt me volgens mij zo wel:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
hoofdindex.id
a.a1
b.b1
c.c1
FROM
hoofdindex
a
b
c
WHERE
a_id = 1
and
b_id.= 1
and
c_id = 1
hoofdindex.id
a.a1
b.b1
c.c1
FROM
hoofdindex
a
b
c
WHERE
a_id = 1
and
b_id.= 1
and
c_id = 1
Alleen het toevoegen lukt me nog niet helemaal
de eerste tabellen lijkt wel te lukken
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
$query1 = "INSERT INTO a VALUES (
'',
'$a1',
'$a2'
)";
mysql_query($query1);
$query2 = "INSERT INTO b VALUES (
'',
'$b1',
'$b2'
)";
mysql_query($query2);
$query3 = "INSERT INTO c VALUES (
'',
'$c1',
'$c2'
)";
mysql_query($query3);
'',
'$a1',
'$a2'
)";
mysql_query($query1);
$query2 = "INSERT INTO b VALUES (
'',
'$b1',
'$b2'
)";
mysql_query($query2);
$query3 = "INSERT INTO c VALUES (
'',
'$c1',
'$c2'
)";
mysql_query($query3);
Maar hoe weet ik welke $*_ids ik in mijn hoofdindex moet zetten bij het toevoegen van gegevens.