Query mislukt
Intussen heb ik nog wel even gekeken of het ook mogelijk was om direct in een query op te halen welke testen getoond moeten worden, op basis van welke boeken af zijn. Hier kan het mee:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
SELECT a.crs_id, GROUP_CONCAT(CAST(b.boek_id/2 AS SIGNED)) AS test_ids
FROM tbl_crs_koppel_boeken a
LEFT JOIN tbl_crs_koppel_boeken b ON (
a.crs_id = b.crs_id
AND b.boek_id = a.boek_id+1
AND b.boek_id % 2 = 0
)
WHERE a.boek_isaf = true
AND b.boek_isaf = true
GROUP BY a.crs_id;
FROM tbl_crs_koppel_boeken a
LEFT JOIN tbl_crs_koppel_boeken b ON (
a.crs_id = b.crs_id
AND b.boek_id = a.boek_id+1
AND b.boek_id % 2 = 0
)
WHERE a.boek_isaf = true
AND b.boek_isaf = true
GROUP BY a.crs_id;
(plaats eventueel in de WHERE nog een filter op het crs_id).
Wat je nu als resultaat krijgt is:
Code (php)
1
2
3
4
5
2
3
4
5
+--------+----------+
| crs_id | test_ids |
+--------+----------+
| 13 | 1,2 |
+--------+----------+
| crs_id | test_ids |
+--------+----------+
| 13 | 1,2 |
+--------+----------+
Oftewel test 1 en test 2 moeten worden getoond. Je kan dit veld in php exploden op de komma en zo heb je een array met de testen. Merk op dat deze query ook nog werkt als je meer dan 6 boeken hebt, maar niet meer als er een test is waar je 1 of 3 boeken (of een ander aantal) voor nodig hebt.
Ik hoop dat ik een mini-tutorial van je kan krijgen, hoe je dit heb bedacht.
Hoe dan ook dit is wat ik er van gemaakt heb (sofar) (Jij zegt dat ik nog een filter voor crs_id kan zetten
maar dat heb ik via php gedaan)
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
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
<tr>
<?php
$show = $dbo->query("SELECT a.crs_id, GROUP_CONCAT( CAST( b.boek_id /2 AS SIGNED ) ) AS test_ids
FROM tbl_crs_koppel_boeken a
LEFT JOIN tbl_crs_koppel_boeken b ON ( a.crs_id = b.crs_id
AND b.boek_id = a.boek_id +1
AND b.boek_id %2 =0 )
WHERE a.boek_isaf = true
AND b.boek_isaf = true
GROUP BY a.crs_id");
if ($show->rowCount() != 0)
{
while ($row = $show->fetch(PDO::FETCH_ASSOC))
{
if ($row['crs_id'] == $_GET['id'])
{
$toets = array(1 => 'Toets 1/2',
2 => 'Toets 3/4',
3 => 'Toets 5/6');
for ($i=1; $i<=count(explode(",",$row['test_ids'])); $i++)
{
?>
<td colspan="2">
<label for="toets1"><?php echo $toets[$i]; ?></label>
<input type="text" style="width:100px;" name="<?php echo '1boek_datum['.$i.']';?>" placeholder="startdatum"/>
</td>
<?php
}
?>
</tr>
<tr>
<?php
for ($i=1; $i<=count(explode(",",$row['test_ids'])); $i++)
{
?>
<td colspan="2">
<label for="toets1"><?php echo $toets[$i]; ?></label>
<select name="<?php echo '1boek_isaf['.$i.']';?>">
<option value="0">niet af</option>
<option value="1">afgerond</option>
</select>
</td>
<?php
}
}
}
}
?>
</tr>
<?php
$show = $dbo->query("SELECT a.crs_id, GROUP_CONCAT( CAST( b.boek_id /2 AS SIGNED ) ) AS test_ids
FROM tbl_crs_koppel_boeken a
LEFT JOIN tbl_crs_koppel_boeken b ON ( a.crs_id = b.crs_id
AND b.boek_id = a.boek_id +1
AND b.boek_id %2 =0 )
WHERE a.boek_isaf = true
AND b.boek_isaf = true
GROUP BY a.crs_id");
if ($show->rowCount() != 0)
{
while ($row = $show->fetch(PDO::FETCH_ASSOC))
{
if ($row['crs_id'] == $_GET['id'])
{
$toets = array(1 => 'Toets 1/2',
2 => 'Toets 3/4',
3 => 'Toets 5/6');
for ($i=1; $i<=count(explode(",",$row['test_ids'])); $i++)
{
?>
<td colspan="2">
<label for="toets1"><?php echo $toets[$i]; ?></label>
<input type="text" style="width:100px;" name="<?php echo '1boek_datum['.$i.']';?>" placeholder="startdatum"/>
</td>
<?php
}
?>
</tr>
<tr>
<?php
for ($i=1; $i<=count(explode(",",$row['test_ids'])); $i++)
{
?>
<td colspan="2">
<label for="toets1"><?php echo $toets[$i]; ?></label>
<select name="<?php echo '1boek_isaf['.$i.']';?>">
<option value="0">niet af</option>
<option value="1">afgerond</option>
</select>
</td>
<?php
}
}
}
}
?>
</tr>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
SELECT a.crs_id, GROUP_CONCAT(CAST(b.boek_id/2 AS SIGNED)) AS test_ids
FROM tbl_crs_koppel_boeken a
LEFT JOIN tbl_crs_koppel_boeken b ON (
a.crs_id = b.crs_id
AND b.boek_id = a.boek_id+1
AND b.boek_id % 2 = 0
)
WHERE a.boek_isaf = true
AND b.boek_isaf = true
AND crs_id = 13
GROUP BY a.crs_id;
FROM tbl_crs_koppel_boeken a
LEFT JOIN tbl_crs_koppel_boeken b ON (
a.crs_id = b.crs_id
AND b.boek_id = a.boek_id+1
AND b.boek_id % 2 = 0
)
WHERE a.boek_isaf = true
AND b.boek_isaf = true
AND crs_id = 13
GROUP BY a.crs_id;
Met alle respect voor Erwins oplossing, maar als je dit soort query's moet gaan maken betekent gewoon dat je database model van alle kanten rammelt.
Ik ben het met je eens Ger. Feit alleen al dat mijn query niet meer werkt als je een ander aantal boeken per test nodig hebt geeft dat al aan.
http://www.phphulp.nl/php/forum/topic/indeling-cursis-database/90675/
hier vandaan.
Als je een betere oplossing heb kan je dat gewoon zeggen, ik moet hier ook van leren, en als je daar toe tot bereidt ben wil je het dan niet te moeilijk maken, anders raak ik in de war.
Toevoeging op 28/05/2013 11:34:53:
Ger ik heb de database model hier vandaan.
Als je een betere oplossing heb kan je dat gewoon zeggen, ik moet hier ook van leren, en als je daar toe tot bereidt ben wil je het dan niet te moeilijk maken, anders raak ik in de war.
Toevoeging op 28/05/2013 11:34:53:
Francoi gckx op 28/05/2013 11:34:24:
Ger ik heb de database model http://www.phphulp.nl/php/forum/topic/indeling-cursis-database/90675/
hier vandaan.
Als je een betere oplossing heb kan je dat gewoon zeggen, ik moet hier ook van leren, en als je daar toe tot bereidt ben wil je het dan niet te moeilijk (qua uitlegen dan) maken, anders raak ik in de war.
hier vandaan.
Als je een betere oplossing heb kan je dat gewoon zeggen, ik moet hier ook van leren, en als je daar toe tot bereidt ben wil je het dan niet te moeilijk (qua uitlegen dan) maken, anders raak ik in de war.
Als je de koppeltabel zou zien als boeken_voltooid_door_cursisten is het misschien makkelijker te begrijpen dat, pas als een cursist klaar is met een boek, deze gegevens worden opgeslagen in de koppeltabel.
Ik heb je in dat andere topic ook een database opzet gegeven met een tabel voor de toetsen:
tabel toetsen:
toets_id, toets_naam, boek_id
1, toets 1/2, 2
2, toets 3/4, 4
3, toets 5, 5
4, toets 6, 6
Een query om te bepalen voor welke toetsen een cursist in aanmerking komt:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT
t.toets_naam
FROM
toetsen t
INNER JOIN
tbl_crs_koppel_boeken b
ON t.boek_id = b.boek_id AND b.cursist_id = 13
t.toets_naam
FROM
toetsen t
INNER JOIN
tbl_crs_koppel_boeken b
ON t.boek_id = b.boek_id AND b.cursist_id = 13
Door de INNER JOIN krijg je alleen die toetsen waarvan het benodigde boek_id in de koppeltabel voorkomt.
Ok hoe doe ik dan waar boek 1 en 2 af is en waar boek 3 4 en 5 af is?
Het gaat nu om een 5 aantal boeken
waar de boeken 1 en 2 af is, volgt een toets
en waar de boeken 3, 4 en 5 af is, volgt een toets
Gewijzigd op 01/06/2013 17:18:37 door Francoi gckx
Dan zal je de database dus echt anders moeten gaan inrichten, zie opmerkingen van Ger. Omdat je nu een flexibel aantal boeken per test krijgt kan je et niet meer simpel te tellen doen (wat ik deed in de eerdere query).
ik heb het nu al helemaal ingebouwd volgens jou query, het maakt mij even op korte termijn niet uit hoe, als ik er maar mee kan werken,
een tussenoplossing suggestie?
jou query werkt nu goed met 1 cursus
alleen die tweede cursus was ik vergeten dat er maar 5 boeken zijn
Toevoeging op 01/06/2013 19:12:47:
Als ik AND b.boek_id %2 =1) verander dan gaat die per 3
Gewijzigd op 01/06/2013 19:00:27 door Francoi gckx
Gewijzigd op 01/06/2013 20:27:16 door Erwin H
Francoi gckx op 01/06/2013 18:58:25:
Het is niet MySQL begrijpen en queries maken maar je moet eerst de basis, je datamodel, goed hebben/maken. Dat heet datamodellering en is niet afhankelijk van MySQL. Je moet eerst een goed datamodel ontwerpen en een keertje terugkoppelen met iemand voordat je tabellen gaat bouwen en programmatuur gaat schrijven. Er is heel veel te lezen over datamodellering en normaalvormen op internet.....totdat ik mysql begrijp zoals hoe jij en ger de kennis heb.
Erwin H op 01/06/2013 20:25:42:
Nee, dat werkt zo niet. Dan zou je %3 = 0 moeten doen, maar dat werkt alleen als alle cursussen uit drie boeken bestaan.
Is een query die kijkt of de EERSTE twee af zijn, daarna een subquery die kijkt of de LAATSTE 3 af zijn ook niet mogelijk?
Toevoeging op 01/06/2013 21:14:04:
@john d
Kan je iets specifiekers zijn waar ik tuts kan vinden over datamodellering en normaalvormen, graag voor beginners
en gradueel naar moeilijk waar ze ook echt bestaande voorbeelden geven.
Ik heb niks aan een verwijzing naar google, ik wil meer in jou boeken of linke kast kijken.
Bedankt
Er moet toch een tussenoplossing zijn (ik ben al bezig met uitproberen) , dan kan ik verder? en dan later wanneer ik de code/database terugkijk wacht er nog veel uitdagingen
Gewijzigd op 01/06/2013 21:16:54 door Francoi gckx
- http://www.phphulp.nl/php/tutorial/overig/welke-tabellen-heb-ik-nodig-/773/ (perfect voor beginners)
- http://www.phphulp.nl/php/tutorial/overig/normaliseren/150/ (gebruikt moeilijke taal, maar de vele voorbeelden verklaren een hoop)
Ik denk dat ik dan Ger voorbeelden ga teruglezen en kijken of ik er uit kom.. anders een nieuw topic.