Toon posts:

[MYSQL] Subselect ombouwen

Pagina: 1
Acties:

Verwijderd

Topicstarter
3 tabellen:

tabel: functies
id
titel
omschrijving

tabel: functiesmedewerkers
fu_id {functie_id}
me_id {medewerker_id}

tabel: medewerkers
[niet belangrijk]

DB: Mysql

De query om te laten zien welke functies iemand heeft is geen probleem:
code:
1
2
3
SELECT f.titel 
FROM functies AS f, functiesmedewerkers AS fm
WHERE fm.me_id=$id AND fm.fu_id=f.id


Omgekeerd, namelijk laten zien welke functies nog beschikbaar zijn is :X
met subselect niet moeilijk, maarja MySQL ondersteund geen subselects 8)7 :
code:
1
2
3
4
5
6
SELECT f.titel
FROM functies AS f
WHERE f.titel NOT IN
  (SELECT f.titel 
  FROM functies AS f, functiesmedewerkers AS fm
  WHERE fm.me_id=$id AND fm.fu_id=f.id)


Veel gezocht op mysql/got maar weinig met ontkennende subselects..

Hoe bouw ik dit om naar iets zonder subselect?

[ Voor 3% gewijzigd door Verwijderd op 09-02-2003 21:17 ]


  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
LEFT JOIN en WHERE iets is NULL? :)

Verwijderd

Topicstarter
Kun je me ff een voorbeeldje geven. Ik heb iets dergelijks geprobeert, maar dat werkte niet.

Verwijderd

je hebt 2 tabellen

news
reacties

code:
1
2
3
4
5
6
7
8
9
10
11
SELECT
    news.*,
    reacties.*
FROM
    news
LEFT JOIN
    reacties
ON
    reacties.n_id = news.id
GROUP BY
    news.id


Als voorbeeld dus

[ Voor 6% gewijzigd door Verwijderd op 10-02-2003 10:35 . Reden: addje ]


Verwijderd

Topicstarter
Verwijderd schreef op 10 februari 2003 @ 10:34:
je hebt 2 tabellen

news
reacties

code:
1
2
3
4
5
6
7
8
9
10
11
SELECT
    news.*,
    reacties.*
FROM
    news
LEFT JOIN
    reacties
ON
    reacties.n_id = news.id
GROUP BY
    news.id


Als voorbeeld dus
Ja ok, maar mijn probleem is dus met ontkenning. dus wat er niet in zit. Hij moet zelg maar laten zien welke functies nog beschikbaar zijn voor een medewerker. Dus laat alle functies zien - functies die de medewerker al heeft.

  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
The queries:

SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);
SELECT * FROM table1 WHERE NOT EXISTS (SELECT id FROM table2
WHERE table1.id=table2.id);
Can be rewritten as:

SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id
WHERE table2.id IS NULL;
Zoeken is een kunst

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 15:16

gorgi_19

Kruimeltjes zijn weer op :9

.

[ Voor 100% gewijzigd door gorgi_19 op 10-02-2003 16:17 . Reden: hier stond iets doms ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
Zoeken is idd een kunst. (NOFI) Die truuk had ik ook al geprobeerd, maar die werkt dus niet:

suggestie was:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> select functies.titel from functies left join functiesmedewerkers on 
functies.id=functiesmedewerkers.fu_id where functiesmedewerkers.fu_id is null;

resultaat:

+---------------+
| titel         |
+---------------+
| PR-medewerker |
+---------------+
1 row in set (0.00 sec)

mysql>


Het resultaat klopt niet omdat de voorbeeldpop in de tabel is:
code:
1
2
3
4
5
6
7
8
9
10
functies  
id  titel          omschrijving  
1   bestuurslid      blabla       
2   systeembeheerder bla bla
3   pr-medewerker    blabla

functiesmedewerkers
fu_id  me_id
2       1
1       2

Het juiste resultaat moet zijn (omdat functies systeembeheer(2) en pr-medewerker (3) niet gekoppeld zijn aan me_id 2)
systeembeheer
pr-medewerker

Maar...omdat medewerker 1 systeembeheerder is laat ie het verkeerde resultaat zien. Vraag blijft dus...hoe los ik dit op?

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

ff uit de losse pols (so be gentle if it doesn't work)
code:
1
2
3
4
5
SELECT f.titel
FROM functies f
LEFT JOIN functiesmedewerker fm
ON f.id = fm.fu_id 
WHERE me_id <> $id OR fu_id IS NULL

Today's subliminal thought is:


Verwijderd

Topicstarter
Annie schreef op 10 February 2003 @ 23:40:
ff uit de losse pols (so be gentle if it doesn't work)
code:
1
2
3
4
5
SELECT f.titel
FROM functies f
LEFT JOIN functiesmedewerker fm
ON f.id = fm.fu_id 
WHERE me_id <> $id OR fu_id IS NULL
WHERE me_id <> $id OR fu_id IS NULL -->Dat deed het hem !!

Geweldig...Bedankt voor het schudden met de pols _/-\o_ _/-\o_ :7
Pagina: 1