login  Naam:   Wachtwoord: 
Registreer je!
 Forum

query meerdere WHARE selecties

Offline munnik - 07/11/2006 21:37 (laatste wijziging 07/11/2006 22:02)
Avatar van munnikNieuw lid hallo ik heb deze code
  1. <?
  2. $query_werknemer="SELECT werknemers.*
  3. FROM werknemers
  4. LEFT JOIN werknemers_in_gebruik
  5. ON werknemers.msg_werknemers_id=werknemers_in_gebruik.msg_werknemers_id
  6. WHERE
  7. werknemers_in_gebruik.msg_werknemers_id IS NULL ";

bij de WHARE wil ik toevoegen dat hij in de tabel werknemers_in_gebruik alleen naar een bepaalde rij kijkt, gespesiviseerd met msg_int_id = ".($_GET['msg_int_id'])."
Hoe moet ik dit er aan toevoegen?

als ik AND geberuik veranderd er namelijk helemaal niks in mijn uikomst

op deze menier heb ik namelijk helemaal geen uitkomst meer
  1. werknemers_in_gebruik.msg_int_id = 53 AND werknemers_in_gebruik.msg_werknemers_id IS NULL ";
  2. ?>


8 antwoorden

Gesponsorde links
Offline Thomas - 08/11/2006 10:39
Avatar van Thomas Moderator Gebruik dan OR? 
Het id kan namelijk nooit een getal bevatten en tegelijkertijd NULL zijn.
Offline munnik - 08/11/2006 18:38
Avatar van munnik Nieuw lid nee het gaat om 2 id's

de id voor de vergelijking met de andere tabel "msg_werknemers_id"
en de id voor de rijen te selecteren "msg_int_id"

hij moet dus naar de rij kijken "msg_int_id" en dan in die rijen kijken of er een vergelijking is voor "msg_werknemers_id"
Offline Thomas - 08/11/2006 18:44
Avatar van Thomas Moderator Owkee. Moeten er geen haken om ON(a.id = b.id)?
Offline munnik - 08/11/2006 18:51 (laatste wijziging 08/11/2006 23:10)
Avatar van munnik Nieuw lid ik heb het geprobeerd maar maakt niks uit

nog even voor de duidelijkheid wat ik wil

tabel: werknemers_in_gebruik

id | naam
---+-------
1 | peter
2 | jaap
3 | karel
4 | joop
5 | pieter

tabel: werknemers

int_id| id
------+---
40 | 3
22 | 1
22 | 3
22 | 4
30 | 4
30 | 5

Elke pagina in mijn website krijgt een int_id mee waarmee bepaald word welke content hij op moet halen.

De uitkomst voor pagina met int_id 30 is

peter
jaap
karel
Offline Thomas - 09/11/2006 16:50
Avatar van Thomas Moderator Aha, dat is dus het gewenste resultaat, dat je de namen krijgt van werknemers_in_gebruik die niet voorkomen in werknemers bij een bepaald int_id.

De manier die jij gebruikt zal denk ik niet werken, omdat als "werknemers_in_gebruik.msg_werknemers_id IS NULL" opgaat, dan is er geen record gevonden in werknemers_in_gebruik dat voldoet, en je kunt geen condities opleggen ("werknemers_in_gebruik.msg_int_id = 53") aan niet-bestaande records .

Wat ik zou doen is alle "werknemers_in_gebruik" opvragen (1 query) en de resultaten van deze query in een array zetten, en vervolgens (nog een query) alle id's van "werknemers" opvragen bij een bepaald int_id, en deze ook in een array zetten, en dan het verschil tussen deze twee arrays bepalen m.b.v. de PHP-functie array_diff(). Dat geeft als ik het goed begrijp hetgene wat jij wilt.

Verdeel en heers .
Offline Gerard - 10/11/2006 02:44
Avatar van Gerard Ouwe rakker Ik ga hier even een pagina uit mijn SQL boek voor jou overtypen en dit zou jou dan de oplossing moeten aandragen. Het is dus zaak dat je deze zelf toepast. Het betreft een oplossing waarbij gebruik gemaakt wordt van subqueries, MySQL heeft hier ondersteuning voor sinds versie 4.1

Begin Quote
Verwijder de personen die op geen enkele opname staan.

Eerste oplossing, met niet-gecorreleerde subselect:

  1. DELETE
  2. FROM Persoon
  3. WHERE persoonId NOT IN (SELECT persoonId
  4. FROM OpnamePersoon)


De subselect levert een constante verzameling persoonId's, en is dus onafhankelijk van de actuele rij. Anders gezegd: de subselect is niet-gecorreleerd. Herschrijven met NOT EXISTS is mogelijk; de subselect moet dan worden gecorreleerd aan de actuele rij van de hoofdselect:

Tweede oplossing, met gecorreleerde subselect:

  1. DELETE
  2. FROM Persoon P
  3. WHERE NOT EXISTS (SELECT *
  4. FROM OpnamePersoon
  5. WHERE persoonId = P.PersoonId)


Ofwel: 'verwijder alle personen waarbij geen bijbehorende persoon in OpnamePersoon bestaat'. Omdat voor beide verwijzingen vanuit KindOUder naar Persoon een cascading delete geldt, zullen eventuele corresponderende rijen van die tabel mééverwijderd worden.
Einde Quote

Hoewel het hier gaat om een DELETE query, zal het niet al te moeilijk zijn om dit voor jezelf even om te zetten naar de query die jij zoekt.

Bron: Relationele Databases en SQL (2de herziene druk) blz 341
Offline Thomas - 10/11/2006 08:50
Avatar van Thomas Moderator Met een geneste query zal het idd ook gaan .
Offline munnik - 10/11/2006 17:55
Avatar van munnik Nieuw lid correctie ik had de tabelnamen omgedraait (soory)

tabel: werknemers (aangepast)

id | naam
---+-------
1 | peter
2 | jaap
3 | karel
4 | joop
5 | pieter

tabel: werknemers_in_gebruik (aangepast)

int_id| id
------+---
40 | 3
22 | 1
22 | 3
22 | 4
30 | 4
30 | 5

ik heb de manier van Proximus geprobeerd, maar ik denk dat ik nog wat verkeerd doe. hij geeft namelijk gewoon alle namen weer zolang er geen overeenkomst met naam id 1 is. als dat wel het geval is geeft hij helemaal geen namen meer weer.

  1. $query_werknemer="SELECT werknemers.*
  2. FROM werknemers
  3. WHERE NOT EXISTS (SELECT *
  4. FROM werknemers_in_gebruik
  5. WHERE msg_werknemers_id=1 AND msg_int_id = 5)";


ik hoop dat jullie me nog verder kunnen helpen
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.223s