query probleem

Pagina: 1
Acties:

  • dwa
  • Registratie: Augustus 2002
  • Niet online
even ter verduidelijking:
3 mysql tabellen:
users tabel --> hierin staan de user naam en id
groepen tabel --> hierin staan de groeps namen en en id
koppel tabbel --> hierin staat welke user lid is van welke groep(en)

dus: als user test (id 1) lid is van de groepen test (id 1) en blaat (id 2) staat er het volgende in de koppeltabel

id | gid | uid
1 | 1 | 1
2 | 2 | 1

stel.. in de groepen tabel zit ook een derde groep root (id 3)

nu wil ik dus het volgende voor elkaar krijgen: als ik de user wil editen en in andere groepen indelen wil ik met een query alle groepen binnen halen (uit de groepen tabel) en daarmee ook gelijk van welke groepen de user lid is.

zoiets dus:

groups.gid | koppel.gid | koppel.uid
1 | 1 | 1
2 | 2 | 1
3 | NULL | NULL

dit heb ik dus nu in een script voor elkaar gekregen maar dan moet ik elke keer als ik een groep heb opgehaald opnieuw een query doen of de user ook daadwerkelijk lid is van deze groep.. en das natuurlijk onnodig veel belasting voor de server... mijn vraag is dus kan dit ook in een query? en zo ja, hoe? misschien niet het meest duidelijke verhaal maar toch.

met vriendelijke groet,

dwa

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Door de alle groepen te selecteren en deze vervolgens te leftjoinen met de koppel tabel krijg je waarschijnlijk wel het gewenste effect.

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


Verwijderd

Kun je me de tabelstructuren beschrijven?

Met een outer join kun je dit namelijk met 1 SQL statement voor elkaar krijgen

  • dwa
  • Registratie: Augustus 2002
  • Niet online
ok here goes:

users tabel:
uid | userName

groepen tabel:
gid | groupName

koppel tabel:

id | gid | uid <-- komen dus de group en user id van bovenstaande tabellen in

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 01-09 12:46

Dido

heforshe

code:
1
2
3
4
SELECT g.GID, COALESCE (k.GID, 0), COALESCE (k.UID, 0)
   FROM groepen g, koppel k, users u
WHERE g.GID = k.GID
     AND u.UID = k.UID

Kan dat zo? (En zo nee, waarom niet?)

Wat betekent mijn avatar?


  • dwa
  • Registratie: Augustus 2002
  • Niet online
dit is het script wat ik nu gebruik, even ter verduidelijking:
en om even een idee te geven wat de bedoeling is; alleen is dit niet echt effectief omdat hij in de while loop telkens opnieuw een query moet uitvoeren.

$gQuery = "SELECT * FROM groups";
$DOgQuery = mysql_query($gQuery) or die ("boeboe2");

echo "bewerk de groepen waar deze user in zit.<p>";
while ($r1 = mysql_fetch_array($DOgQuery)) {
$GID = $r1["GID"];

$CURgQuery = "SELECT GID FROM koppel WHERE UID = '$uid' AND GID = '$GID'";
$doCURgQuery = mysql_query($CURgQuery);

$r2 = mysql_fetch_array($doCURgQuery);
$curGID = $r2["GID"];


if ($GID == $curGID) {
echo "$curGID <input type=checkbox name=group[] checked><p>";
} else {
echo "$GID <input type = checkbox name=group[]><p>";
}
}

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Dido schreef op 26 augustus 2002 @ 11:18:
code:
1
2
3
4
SELECT g.GID, COALESCE (k.GID, 0), COALESCE (k.UID, 0)
   FROM groepen g, koppel k, users u
WHERE g.GID = k.GID
     AND u.UID = k.UID

Kan dat zo? (En zo nee, waarom niet?)

Dit wil niet omdat de topicstarter ook een record van een groep wil krijgen waneer een persoon hier geen lid van is. Hiervoor zul je een left join moeten gebruiken. Eigenschap van de left join is dat een record niet wordt weggelaten waneer er geen 'match' gevonden is, maar er gewoon null waardes worden ingevuld.

Een werkende query zou zijn:
code:
1
2
3
4
5
6
7
8
9
10
SELECT g.velden..... ,u.velden....
FROM 
 ( groepen g 
  LEFT JOIN 
   koppel k
  ON (g.id = k.gid AND k.uid= %%USERID%%)
  )
 LEFT JOIN
  user u
 ON (u.id=k.uid)

Uit het hoofd en niet getest

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


  • dwa
  • Registratie: Augustus 2002
  • Niet online
thanx.. werkt perfect..

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 01-09 12:46

Dido

heforshe

|:(
* Dido begrijpt nu ook waarom er vanochtend wel meer niet lukt...

Wat betekent mijn avatar?

Pagina: 1