Query mislukt
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
SELECT crs_id, boek_id, boek_isaf FROM tbl_crs_koppel_boeken
WHERE crs_id = 4 AND
(boek_id = '1' AND boek_isaf = '1') AND
(boek_id = '2' AND boek_isaf = '1')
?>
SELECT crs_id, boek_id, boek_isaf FROM tbl_crs_koppel_boeken
WHERE crs_id = 4 AND
(boek_id = '1' AND boek_isaf = '1') AND
(boek_id = '2' AND boek_isaf = '1')
?>
Ik wil dus dit: selecteer crs_id 4 waarvan boek_id 1 is en boek_isaf 1 is
en selecteer crs_id 4 waarvan boek_id 2 is en boek_isaf 1 is
Dit doet die wel
Als je de boeken die af zijn wilt selecteren per cursus is het voldoende om op boek_isaf en het cursus_id te filteren. Dus
Dat is niet wat ik wil
ik wil dat als boek 1 en 2 af zijn, een nieuwe kolom moet komen voor toets die over boek 1 en 2 gaat
dus dan moet ik alleen bepalen of 1 EN 2 af is
Wat jij (eva) fout doe(t)(n) is dat je een database in elkaar flanst en dan gaat kijken hoe je er info uit gaat halen. De manier waarop je informatie opslaat staat niet los van de informatie behoefte,
http://www.phphulp.nl/php/forum/topic/indeling-cursis-database/90675/
Ik snap niet waarom dit niet mogelijk is
Ik heb de tabel opbouw afgeleidt van de vorige topic: Ik snap niet waarom dit niet mogelijk is
Francoi gckx op 26/05/2013 20:14:00:
Wat denk je zelf.
Stel boek_id is 1 dan staat er dus WHERE 1 = 1 AND (en) 1 = 2
maar hoe moet ik boek_id 2 met boekisaf = 1 in deze query vinden?
het boek_id is 1 OF het boek_id is 2, het kan niet 1 EN 2 zijn. Of in het Engels is OR (hint, hint).
SELECT crs_id, boek_id, boek_isaf FROM tbl_crs_koppel_boeken
WHERE crs_id = 4 AND
((boek_id = '1' OR boek_id = '2' ) AND boek_isaf = '1')
Alleen als boek_id = 2 waar boek_isaf = 0 dan komt die ook true uit.
Misschien kan ik gewoon boek_id 1 negeren want als boek_id 2 af is dan is het ook logisch dat boek 1 af is.
Dus gewoon zo dan maar:
WHERE crs_id = ".$_GET['id']." AND
(boek_id = '1' AND boek_isaf = '1')");
Wees vrij om nog te reageren
Francoi gckx op 26/05/2013 20:48:13:
((boek_id = '1' OR boek_id = '2' ) AND boek_isaf = '1')
Uiteraard bedoel je hier:
((boek_id = '1' AND boek_isaf = '1') OR
(boek_id = '2' AND boek_isaf = '1'))
Dus het moet sowieso dit gewoon worden
(boek_id = '2' AND boek_isaf = '1')
Gewijzigd op 27/05/2013 08:30:52 door Francoi gckx
Willem vp op 27/05/2013 00:22:57:
Uiteraard bedoel je hier:
((boek_id = '1' AND boek_isaf = '1') OR
(boek_id = '2' AND boek_isaf = '1'))
Francoi gckx op 26/05/2013 20:48:13:
((boek_id = '1' OR boek_id = '2' ) AND boek_isaf = '1')
Uiteraard bedoel je hier:
((boek_id = '1' AND boek_isaf = '1') OR
(boek_id = '2' AND boek_isaf = '1'))
En uiteraard zijn bovenstaande twee queries precies hetzelfde. het 'boek_isaf = 1' gedeelte kan je 'buiten haakjes halen'.
Francoi gckx op 26/05/2013 20:48:13:
Alleen als boek_id = 2 waar boek_isaf = 0 dan komt die ook true uit.
Misschien kan ik gewoon boek_id 1 negeren want als boek_id 2 af is dan is het ook logisch dat boek 1 af is.
Misschien kan ik gewoon boek_id 1 negeren want als boek_id 2 af is dan is het ook logisch dat boek 1 af is.
Begrijp ik hiermee dat je de crs_id's wilt vinden waarbij zowel boek 1 als boek 2 allebei af zijn? Dan krijg je namelijk een heel andere query, omdat je dan crs_id's wilt vinden die bepaalden kenmerken hebben verdeeld over meerdere rijen in je database. Dat kan prima overigens, het gaat dan alleen iets anders.
Gewijzigd op 27/05/2013 08:47:37 door Erwin H
Erwin H op 27/05/2013 08:47:10:
Begrijp ik hiermee dat je de crs_id's wilt vinden waarbij zowel boek 1 als boek 2 allebei af zijn? Dan krijg je namelijk een heel andere query, omdat je dan crs_id's wilt vinden die bepaalden kenmerken hebben verdeeld over meerdere rijen in je database. Dat kan prima overigens, het gaat dan alleen iets anders.
Begrijp ik hiermee dat je de crs_id's wilt vinden waarbij zowel boek 1 als boek 2 allebei af zijn? Dan krijg je namelijk een heel andere query, omdat je dan crs_id's wilt vinden die bepaalden kenmerken hebben verdeeld over meerdere rijen in je database. Dat kan prima overigens, het gaat dan alleen iets anders.
Ja dat wil ik, ik ben nog niet goed in mysql (heb een paar boeken nu die ik nog moet lezen)
Hoe anders gaat het dan?
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, b.boek_id, b.boek_isaf
FROM(
SELECT crs_id
FROM tbl_crs_koppel_boeken
WHERE (boek_id = 1 OR boek_id = 2)
AND boek_isaf = 1
GROUP BY crs_id
HAVING count(*) = 2
) a
INNER JOIN tbl_crs_koppel_boeken b ON a.crs_id = b.crs_id
FROM(
SELECT crs_id
FROM tbl_crs_koppel_boeken
WHERE (boek_id = 1 OR boek_id = 2)
AND boek_isaf = 1
GROUP BY crs_id
HAVING count(*) = 2
) a
INNER JOIN tbl_crs_koppel_boeken b ON a.crs_id = b.crs_id
Dus selecteer je alle rijen waarvoor geldt dat boek 1 af is, of boek 2 af is. Je groepeert de resultaten per crs_id en daarover zeg je nog dat je alleen de crs_id wilt hebben die tenminste twee rijen heeft (met andere woorden, zowel boek 1 als boek 2 is af).
Aan de resultaten van die eerste query koppel je dan weer de rest van de gegevens die je nodig hebt. Op die manier krijg je dus wel alle rijen terug voor een bepaald crs_id, maar toch alleen voor de crs_id's die aan de voor waarden voldoen. Eventueel kan je hier nog extr WHERE statements etc toevoegen (na de JOIN).
dat zou mij enorm helpen:
SELECT a.crs_id, b.boek_id, b.boek_isaf
FROM (
SELECT crs_id
FROM tbl_crs_koppel_boeken
WHERE (
boek_id =1
OR boek_id =2
)
AND boek_isaf =1
GROUP BY crs_id
HAVING count( * ) =2
)a
INNER JOIN tbl_crs_koppel_boeken b ON a.crs_id = b.crs_id
LIMIT 0 , 30
Ik heb jou query in phpmyadmin uitgevoert maar ik krijg nu dit als tabel:
crs_id boek_id boek_isaf
13 1 1
13 2 1
13 3 1
13 4 1
13 5 1
13 6 0
(PS ik dacht dat joins alleen nodig is als je twee table met elkaar koppelt ofzo)
Dan is het element met crs_id 13 de enige die aan de voorwaarden voldoet dat boek 1 en 2 af zijn.
dus je heb een toets over deel 1en2, toets over deel 3en4, toets over deel 5en6
en bij jou is de rowcount dan 6 als boek 1 en 2 af is.
Ik had het zo 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$show = $dbo->query("SELECT boek_id, boek_isaf FROM tbl_crs_koppel_boeken
WHERE crs_id = ".$_GET['id']." AND
(boek_id = '2' AND boek_isaf = '1') OR
(boek_id = '4' AND boek_isaf = '1') OR
(boek_id = '6' AND boek_isaf = '1') ");
if ($show->rowCount() != 0)
{
$toets = array(1 => 'Toets 1/2',
2 => 'Toets 3/4',
3 => 'Toets 5/6');
for ($i=1; $i<=$show->rowCount(); $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>
$show = $dbo->query("SELECT boek_id, boek_isaf FROM tbl_crs_koppel_boeken
WHERE crs_id = ".$_GET['id']." AND
(boek_id = '2' AND boek_isaf = '1') OR
(boek_id = '4' AND boek_isaf = '1') OR
(boek_id = '6' AND boek_isaf = '1') ");
if ($show->rowCount() != 0)
{
$toets = array(1 => 'Toets 1/2',
2 => 'Toets 3/4',
3 => 'Toets 5/6');
for ($i=1; $i<=$show->rowCount(); $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>
Gewijzigd op 27/05/2013 13:57:26 door Francoi gckx
Ok, dus nu vertel je weer iets anders. Wat wil je nu? Misschien ligt het aan mij, maar ik ben nu echt kwijt wat je probeert te doen met deze query.
http://imageshack.us/f/577/voorbeeldc.jpg/
Toevoeging op 27/05/2013 15:03:28:
Dit zijn 3 printscreens
al genoeg.
Als dat zo is: Voeg een nieuw toetskolom toe (zie middelste plaatje)
Als ook nog boek (3) en 4 af is voeg een toetskolom toe
en datzelfde met de laatste 2 boeken (laatste plaatje)
Toevoeging op 27/05/2013 15:18:49:
Het is niet zo dat ik iets eruit wil halen uit deze specifieke query
maar meer bepalen waar een cursist is en of die een toetts moet maken
Toevoeging op 27/05/2013 15:27:04:
o zo doet die het wel
SELECT crs_id, boek_id, boek_isaf FROM tbl_crs_koppel_boeken
WHERE crs_id = 13 AND
(boek_id = '2' AND boek_isaf = '1') OR
(crs_id = 13 AND boek_id = '4' AND boek_isaf = '1') OR
(crs_id = 13 AND boek_id = '6' AND boek_isaf = '1')
Gewijzigd op 27/05/2013 15:32:50 door Francoi gckx