[SQL] SELECT vraag

Pagina: 1
Acties:

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 23-08 10:29
Hoe kan ik zoeits voorelkaar krijgen... ik heb 2 tabellen uitgeleend en boeken.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CREATE TABLE uitgeleend (
  id mediumint(9) NOT NULL auto_increment,
  aan mediumint(9) NOT NULL default '0',
  datum varchar(10) NOT NULL default '',
  PRIMARY KEY  (id),
  UNIQUE KEY id (id)
)

CREATE TABLE boeken (
  id mediumint(9) NOT NULL auto_increment,
  ISBN varchar(13) NOT NULL default '0',
  titel varchar(250) NOT NULL default '',
  auteur varchar(250) NOT NULL default '',
  uitgever varchar(250) NOT NULL default '',
  beschrijving mediumtext NOT NULL,
  genre varchar(250) NOT NULL default '',
  aantal_pag mediumint(9) NOT NULL default '0',
  editie varchar(10) NOT NULL default '',
  aanwezig enum('0','1') NOT NULL default '0',
  uitgeleend mediumint(9) NOT NULL default '0',
  PRIMARY KEY  (id),
  UNIQUE KEY id (id)
)

Het veld uitgeleend in boeken bevat de id van uitgeleend...

aan in boeken is weer gekoppeld aan een lid id

Nu wil ik bijvoorbeeld van lid 2 alle uitgeleende boeken zien... dus als ze in uitgeleend staan...
code:
1
 SELECT id FROM uitgeleend WHERE aan = 2

En dan moet ik met die uitslag (Bijvoorbeeld 3,5,8 en 10) alle boeken uit de tabel boeken halen die die uitslag in uitgeleend heeft staan.

Kan dat met zoiets:
[code]
SELECT * FROM boeken WHERE uitgeleend = SELECT id FROM uitgeleend WHERE aan = 4
[code]

  • Borrie
  • Registratie: Juli 2000
  • Laatst online: 07-09-2022
Je kan zoiets proberen:

SELECT * FROM boeken WHERE uitgeleend NOT IN (SELECT id FROM uitgeleend WHERE aan = 4)

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Op maandag 21 januari 2002 15:52 schreef Monstar.nl het volgende:
[..]

Kan dat met zoiets:
[code]
SELECT * FROM boeken WHERE uitgeleend = SELECT id FROM uitgeleend WHERE aan = 4
[code]
Ja, maar dan zou ik:

SELECT * FROM boeken WHERE uitgeleend IN ( SELECT id FROM uitgeleend WHERE aan = 4)

Verwijderd

Dit bovenste werkt overigens niet bij MySQL, want die kan geen subqueries aan.

  • Borrie
  • Registratie: Juli 2000
  • Laatst online: 07-09-2022
Op maandag 21 januari 2002 15:56 schreef Borrie het volgende:
Je kan zoiets proberen:

SELECT * FROM boeken WHERE uitgeleend NOT IN (SELECT id FROM uitgeleend WHERE aan = 4)
ik bedoel natuurlijk ook IN en geen NOT in..... |:(

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 23-08 10:29
Laat ik nou net MySQL hebben... :'( Hoe moet ik het nou doen dan?

Verwijderd

Ff een innerjoin doen ofzo. Er staan goede voorbeelden in de Manual van Mysql op http://www.mysql.com. Suc6

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12-09 21:31

Janoz

Moderator Devschuur®

!litemod

Waarom zet je in boeken een verwijzing naar uitgeleend??? Het is toch veel makkelijker als je een verwijzing vanuit uitgeleend naar boeken maakt. Daarnaast zie ik nog veel meer tekenen van brak db design, maar dit lijkt me eerst de belangrijkste...

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

hmz, aanpak lijkt mij wat omslachtig zoals je dat nu doet. je zou een tabel kunnen maken met daarin de lener informatie en een tabel met boek informatie. Vervolgens maak je een derde tabel met daarin de uitleeninformatie, dus met een boekID en een lenerID, een datum en een tijd.
Met behulp van joins kan je dan alle informatie in 1 keer uitlezen, in plaats van met subselects... Bovendien heb je dan ook een genormaliseerde database :) Daarnaast hoef je bij iedere uitlening maar 1 mutatie te doen in de uitleentabel en heb je ook een uitleen geschiedenis. Stuk meer informatie dan dat je nu hebt :)

Verwijderd

Op maandag 21 januari 2002 16:02 schreef Janoz het volgende:
Waarom zet je in boeken een verwijzing naar uitgeleend??? Het is toch veel makkelijker als je een verwijzing vanuit uitgeleend naar boeken maakt. Daarnaast zie ik nog veel meer tekenen van brak db design, maar dit lijkt me eerst de belangrijkste...
[off topic]
great minds think alike ;)
[/off topic]

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Ow cool.. nu kan men twee keer hetzelfde boek uitlenen >:)

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Wacht, nog erger je kan een boek wel uitlenen er wordt alleen niet bijgehouden WELK boek er wordt uitgeleend :+

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

In je CREATE TABLE van uitgeleend moet de auto_increment weg bij mediumint. Dit is namelijk een verwijzing naar een medium.
Het veld uitgeleend bij boeken kan weg.

Verder kan het met een gewone join:
code:
1
2
3
4
5
select b.*
from   boeken b
    ,uitgeleend u
where  u.aan=4
and    b.mediumint=b.mediumint

suc6

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 23-08 10:29
Hoezo kan ik tweekeer een boek uitlenen? Volgens mij kan ik gewoon zien als een boek is uitgeleend of niet...

maar ik moet toegeven het is een beetje brak... maar dat is windows ook...

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Op maandag 21 januari 2002 16:09 schreef dusty het volgende:
Wacht, nog erger je kan een boek wel uitlenen er wordt alleen niet bijgehouden WELK boek er wordt uitgeleend :+
Dusty, jij ging voor een lightmodschap? Een iets andere reactie vergroot je kansen aanzienlijk.
Help eens, niet afschieten.

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Op maandag 21 januari 2002 16:31 schreef Monstar.nl het volgende:
Hoezo kan ik tweekeer een boek uitlenen? Volgens mij kan ik gewoon zien als een boek is uitgeleend of niet...

maar ik moet toegeven het is een beetje brak... maar dat is windows ook...
Kijk maar even naar mijn vorige post voor wat hints. Het veld aanwezig is ook niet nodig, denk ik, want dat is af te leiden uit of er een record bestaat in de tabel uitgeleend.

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op maandag 21 januari 2002 16:31 schreef Monstar.nl het volgende:
Hoezo kan ik tweekeer een boek uitlenen? Volgens mij kan ik gewoon zien als een boek is uitgeleend of niet...

maar ik moet toegeven het is een beetje brak... maar dat is windows ook...
zie:
CREATE TABLE uitgeleend (
id mediumint(9) NOT NULL auto_increment,
aan mediumint(9) NOT NULL default '0',
datum varchar(10) NOT NULL default '',
PRIMARY KEY (id),
UNIQUE KEY id (id)
)
Je voegt een nieuwe item toe.
ID wordt automatisch bepaald,
aan is een persoon.
en de datum.
Omdat ID al primary key is en auto_increment heeft de Unique key al geen zin.

Je kan niet zeggen boek 1 wordt voor boek 2 uitgeleend (immers zit in dit tabel auto_increment) voor de ID, dus uit de uitgeleend tabel kan je niet halen WELK boek WIE heeft geleend.

Toch je database overnieuw ontwerpen ;)

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 23-08 10:29
Maarrrrrr.... ik heb het gewoon opgelost door wat te lopen kutten in php...
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
<?
include("../lib/func.php3");
connect();

$sql = "SELECT id FROM uitgeleend WHERE aan = $id";
$res = mysql_query($sql) or die(mysql_error());

if(mysql_num_rows($res) != 0){

$idb = array();
while($row=mysql_fetch_object($res))
 $idb[]=$row->id;
<table width="100%" border="0" cellspacing="4" cellpadding="0">
  <tr>
    <td width="87">ISBN NR.</td>
    <td>Titel</td>
    <td>Auteur</td>
    <td>Uitgever</td>    
    <td width="59">Aanwezig</td>
  </tr> 
  <tr>
    <td width="87" bgcolor="#000000"></td>
    <td bgcolor="#000000"></td>
    <td bgcolor="#000000"></td>
    <td bgcolor="#000000"></td>    
    <td width="59" bgcolor="#000000"></td>
  </tr> 
<?
for($i=0;$i<sizeof($id);$i++){
 $sql = "SELECT * FROM boeken WHERE uitgeleend = $idb[$i]";
 $res = mysql_query($sql) or die(mysql_error());
 ?>
  <tr>
    <td width="87"><? echo mysql_result($res,0,"ISBN"); ?></td>
    <td><? echo "<a href=\"../details.php3?id=".mysql_result($res,0,"id")."\" target=\"_self\">".mysql_result($res,0,"titel")."</a>"; ?></td>
    <td><? echo mysql_result($res,0,"auteur"); ?></td>
    <td><? echo mysql_result($res,0,"uitgever"); ?></td>    
    <td width="59" align="center"><? if(mysql_result($res,0,"aanwezig") == 1) echo "<font color=\"green\"><b>Ja"; else echo "<font color=\"red\"><b>Nee"; ?></td>
  </tr>
 <?
}
?> 
</table>
?>

Zo kan het ook ;)

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op maandag 21 januari 2002 16:33 schreef Goodielover het volgende:
[..]
Dusty, jij ging voor een lightmodschap? Een iets andere reactie vergroot je kansen aanzienlijk.
Help eens, niet afschieten.
Ik schiet iemand zelden af met mijn eerste reply. Hier deed ik dat ook niet.. ik gaf alleen een probleem aan, dan is het aan hem de taak te vinden hoe hij dat kan verhelpen, Zoals je zag ziet hij niet wat er fout is, dus geef ik een extra hint. Ik ga geen oplossingen voor schotelen, dat heb ik nooit gedaan en dat ga ik nu ook niet opeens doen.

Dat ik bereid ben een lite-mod te worden beinvloed mijn gedrag niet, ik weiger opeens heel 'vriendelijk en behulpzaam' te zijn door meteen alle oplossingen voor te schotelen om misschien een beetje macht te krijgen, als ik het lite-mod wordt dan wordt ik het, wordt ik het niet, dan niet. Ik zal er niet wakker van liggen.

Daarnaast kan je je gaan afvragen of als iemand zijn gedrag opeens veranderd omdat ie dan misschien wel een lite-mod kan worden wel zo geschikt is om lite-mod te worden.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Natuurlijk kan het ook anders, maar nu mag je best een beetje vertrouwen op de Goeroes die hier rondlopen. Je ontwerp klopt niet. Hier krijg je vroeg of laat gedonder mee. Zoals een inconsistente database. Boeken die uitgeleend staan, maar dat niet zijn en omgekeerd.
Bovendien wordt je programmatuur erg slecht te begrijpen.

Succes, maar vraag niet om advies, om het daarna in de wind te slaan. Daarvoor zit ik niet uitgebreid je tabellen en je probleem te analyseren. :(

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op maandag 21 januari 2002 16:38 schreef Monstar.nl het volgende:
[..]
Zo kan het ook ;)
En hoe weet je wie het boek voor de huidige persoon heeft geleend, persoon komt terug, boek is beschadigd, neem ik toch aan dat je even wilt achterhalen wie de persoon is geweest voor de huidige "lener".

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 23-08 10:29
Euhm... niet tegen de leraar zeggen maareuh... dat weet ik niet *D

[edit]
Ow ja... het is niet de bedoeling geweest om iemand de wind van voren te geven oid maar ik wou gewoon ff laten zien hoe ik het opgelost heb... ipv mijn hele database opnieuw te maken die ik morgen moet inleveren... trouwens... er wordt niet naar het programmeren gekeken maar naar de functionaliteit...

maar ik wil toch wel iedereen bedanken!

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

off-topic, maar toch:
Dusty, tweede keer vandaag (ik moet daar eens mee ophouden): Ik waardeer je om je inhoudelijke kennis.
Je hoeft ook niet anders te worden, maar modden? jij?

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op maandag 21 januari 2002 16:45 schreef Goodielover het volgende:
[..]
Je hoeft ook niet anders te worden, maar modden? jij?
Referenties nodig? :+

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR

Pagina: 1