Toon posts:

[MySQL] velden uit tabellen dynamisch linken.

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben al de hele dag bezig om 2 velden uit verschillende tabellen te linken, maar het wil niet echt lukken...

De 2 tabellen zijn

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
school
  `id` int(10) NOT NULL auto_increment,
  `type` tinyint(3) NOT NULL default '0',
  `vak` varchar(255) NOT NULL default '',
  `onderwerp` varchar(255) NOT NULL default '',
  `gemaakt_door` varchar(255) NOT NULL default '',
  `anoniem` tinyint(1) NOT NULL default '0',
  `klas` tinyint(1) NOT NULL default '0',
  `periode` tinyint(1) NOT NULL default '0',
  `ip` varchar(20) NOT NULL default '',
  `timestamp` varchar(20) NOT NULL default '',
  `bestandsnaam` varchar(255) NOT NULL default '',
  `hits` int(10) NOT NULL default '0',
  `stemmen` int(10) NOT NULL default '0',
  `totaalscore` int(10) NOT NULL default '0',
  `checksum` varchar(255) NOT NULL default '',
  `marked` tinyint(1) NOT NULL default '0',
  `topicid` varchar(20) NOT NULL default '',
  `virusscan` text NOT NULL,


en

code:
1
2
3
4
5
school_hits
  `id` int(10) NOT NULL auto_increment,
  `school_id` int(10) NOT NULL default '0',
  `aantal` int(10) NOT NULL default '0',
  `laatstedownload` varchar(20) NOT NULL default '',


Nou wil ik dus, dat als school_hits.aantal wordt geupdate, dat school.hits "dynamisch" dezelfde waarde krijgt.

Dus stel je hebt dit:
code:
1
2
3
4
5
6
mysql> SELECT * FROM school_hits WHERE school_id = 4;
+----+-----------+--------+-----------------+
| id | school_id | aantal | laatstedownload |
+----+-----------+--------+-----------------+
| 53 |         4 |      3 | 1097400778      |
+----+-----------+--------+-----------------+


dan wil ik dat het veld hits in tabel school met het id = 4, de waarde 3 weergeeft als ik een SELECT query doe (het moet er NIET statisch instaan.)
code:
1
2
3
4
5
6
mysql> SELECT id, hits FROM school WHERE id = 4;
+----+------+
| id | hits |
+----+------+
|  4 |    0 |
+----+------+


Is dit mogelijk met MySQL 4.1? en zoja, hoe? want ik heb al gegoogled, de manual doorgezocht en de search gebruikt op GoT, maar ik kon helaas niks vinden :(

[ Voor 7% gewijzigd door Verwijderd op 16-10-2004 20:22 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Ah, logisch....je wil een veld ophalen, maar niet met de waarde die erin zit? :?

Gebruik gewoon een alias ofzo.
code:
1
SELECT school.id, school_hits.aantal AS hits FROM school, school_hits WHERE id = 4;

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
NMe84 schreef op 16 oktober 2004 @ 20:36:
Ah, logisch....je wil een veld ophalen, maar niet met de waarde die erin zit? :?

Gebruik gewoon een alias ofzo.
code:
1
SELECT school.id, school_hits.aantal AS hits FROM school, school_hits WHERE id = 4;
Is dit de enige manier? dit is wel wat ik wil hebben, maar is er niet een manier, dat als ik de query "SELECT * FROM school" uitvoer, dat hij dan alles automatisch invult in het veld "hits"?
Ik heb wel iets gevonden in PHPMyAdmin met linked tables, maar als ik dan bij het veld school_hits.aantal wil invullen, met als relation school.hits, en dan invul "ON UPDATE CASCADE", dan wil hij het niet opslaan.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Verwijderd schreef op 16 oktober 2004 @ 22:10:
Is dit de enige manier? dit is wel wat ik wil hebben, maar is er niet een manier, dat als ik de query "SELECT * FROM school" uitvoer, dat hij dan alles automatisch invult in het veld "hits"?
Ik heb wel iets gevonden in PHPMyAdmin met linked tables, maar als ik dan bij het veld school_hits.aantal wil invullen, met als relation school.hits, en dan invul "ON UPDATE CASCADE", dan wil hij het niet opslaan.
Er zijn zat manieren, maar volgens mij geen enkele die je gegevens uit laat lezen uit een tabel, maar stiekem die gegevens toch uit een andere tabel haalt. :P

Wat is er mis met het gebruik van een alias? En waarom wil je het per se niet met een alias doen?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Met MySQL kan dit in 1 query, zie de syntax van het UPDATE statement in de online-documentatie:

code:
1
2
3
4
5
6
7
8
UPDATE
    school, school_hits
SET
    school.hits = school.hits + <aantal>,
    school_hits.aantal = <aantal>
WHERE
    school.id = school_hits.school_id
    and school.id = <de ID>

[ Voor 7% gewijzigd door Verwijderd op 17-10-2004 01:11 ]


  • Postman
  • Registratie: Februari 2000
  • Laatst online: 01-05 13:23
Het moet niet statisch in school.hits staan maar toch wel worden weergegeven?? Waarom heb je dan een school.hits vraag ik me af?

Verder weet ik niet of MySQL 4.1 eindelijk eens JOINs ondersteund, ik hoop het wel. Joins zouden namelijk een zeer makkelijke oplossing zijn die ook nog eens de hele school.hits overbodig maakt en geen extra UPDATE statements vereist.
Oops, stom van me 8)7... Joins waren er wel in 3.xx, maar UNIONs niet (als de manual van MySQL klopt, anders had ik toch gelijk :P)

[ Voor 19% gewijzigd door Postman op 17-10-2004 01:20 ]


  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 12-05 15:26

Eelke Spaak

- Vlad -

Dat je per se dezelfde waarde wilt hebben in 2 verschillende kolommen van 2 verschillende tabellen duidt op een slecht data-baseontwerp.

Op basis van deze gegevens, zou ik zeggen: haal die hele 'hits' weg, en haal met de volgende query de gewenste data op:

SQL:
1
SELECT school.id, school_hits.aantal FROM school, school_hits WHERE school_hits.school_id = school.id


Dit levert je (volgens mij) precies de gewenste results. Eventueel kan je met een alias achter school_hits.aantal (AS hits) de kolom nog referencen met hits als je wil, zoals NMe84 al zei.

TheStreme - Share anything with anyone


Verwijderd

Topicstarter
Eelke Spaak schreef op 17 oktober 2004 @ 10:43:
Dat je per se dezelfde waarde wilt hebben in 2 verschillende kolommen van 2 verschillende tabellen duidt op een slecht data-baseontwerp.

Op basis van deze gegevens, zou ik zeggen: haal die hele 'hits' weg, en haal met de volgende query de gewenste data op:

SQL:
1
SELECT school.id, school_hits.aantal FROM school, school_hits WHERE school_hits.school_id = school.id


Dit levert je (volgens mij) precies de gewenste results. Eventueel kan je met een alias achter school_hits.aantal (AS hits) de kolom nog referencen met hits als je wil, zoals NMe84 al zei.
Je hebt gelijk, school.hits is helemaal niet nodig.Ik heb met behulp van een JOIN de query gemaakt die me het gewenste resultaat geeft:
code:
1
SELECT school.id, school_hits.aantal as hits FROM school LEFT JOIN school_hits ON school.id = school_hits.school_id


Ik dacht zeg maar een "virtueel" veld hits te maken in school, die z'n waarde automatisch krijg van school_hits.aantal, maar zo kan het dus ook :)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Waarom een LEFT JOIN?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Omdat niet alle school.id's een bijbehorende school_hits.school_id hebben ;)

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 19-05 21:26

MBV

bij zoiets kan je toch ook een soort schaduwtabel maken?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Verwijderd schreef op 17 oktober 2004 @ 23:20:
Omdat niet alle school.id's een bijbehorende school_hits.school_id hebben ;)
Hmm, makes sense. :)

Maar ik vraag me nou eigenlijk wel af waarom je twee tabellen gebruikt, aangezien die zich, voor zover ik kan zien, 1:1 met elkaar verhouden. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
[quote]NMe84 schreef op 18 oktober 2004 @ 03:13:
[...]

Hmm, makes sense. :)

Maar ik vraag me nou eigenlijk wel af waarom je twee tabellen gebruikt, aangezien die zich, voor zover ik kan zien, 1:1 met elkaar verhouden. :)[/quot

De tabel school_hits bevat meer informatie over die hits (timestamp van laatste hit etc ;))
Pagina: 1