[SQL] Tegenstrijdige where clause

Pagina: 1
Acties:

  • ProgrammerX
  • Registratie: Juli 2002
  • Laatst online: 26-02-2021
Ik ben een helpdesk applicatie aan het maken voor inetrn gebruik. Met dit pakketje willen we registreren welke klant welk pakket heeft met welke modules.

Nu wil ik een overzicht hebben van alle klanten die bepaalde verzameling van modules hebben, dus bijvoorbeeld een overzicht van alle klanten die module A, module B en eventueel module D hebben (dus A+B+D en A+B).

Ik heb een tabel KLANTEN, een tabel KLANT_MOD en een tabel MODULES. Nu link ik deze aan elkaar door middel van unieke ID's (integers).

Nu moet ik ongeveer een query hebben die bijvoorbeeld zo gaat:

code:
1
2
3
4
5
6
SELECT K.*
FROM KLANTEN K, KLANT_MOD KM
WHERE KM.KLANT_ID = K.KLANT_ID
AND KM.MODULE_ID = 1
AND KM.MODULE_ID = 3
OR KM.MODULE_ID = 6


Dit levert uiteraard een lege result set op en kan dus logisch gezien gewoon niet :) Maar hoe los ik het wel op ?

Ik gebruik trouwens MySQL i.c.m. Delphi.

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
ik denk dat je je vraag even moet uitleggen. het verhaaltje er om heen is leuk, maar ik snap niet wat je nou uit die DB wil halen.

ik denk dat het een haakjes zaak wordt

This message was sent on 100% recyclable electrons.


Verwijderd

SELECT K.*
FROM KLANTEN K, KLANT_MOD KM
WHERE (KM.KLANT_ID = K.KLANT_ID)
AND (KM.MODULE_ID = 1)
UNION
SELECT K.*
FROM KLANTEN K, KLANT_MOD KM
WHERE (KM.KLANT_ID = K.KLANT_ID)
AND (KM.MODULE_ID = 3)
UNION
SELECT K.*
FROM KLANTEN K, KLANT_MOD KM
WHERE (KM.KLANT_ID = K.KLANT_ID)
AND (KM.MODULE_ID = 6)

Ps traag als dikke stront maar dit is wat ik uit je verhaal begrijp

  • ProgrammerX
  • Registratie: Juli 2002
  • Laatst online: 26-02-2021
BasieP schreef op 13 November 2002 @ 11:54:
ik denk dat je je vraag even moet uitleggen. het verhaaltje er om heen is leuk, maar ik snap niet wat je nou uit die DB wil halen.

ik denk dat het een haakjes zaak wordt
Ik wil graag weten welke klant welke modules heeft. Dit kan ik delphi oplossen met losse queries (per module kijken welke klanten hierbij horen) en zelf de resultaten samenvoegen, maar ik wil dit graag oplossen m.b.v. sql.

De gebruiker selecteerd dus een aantal modules (bijvoorbeeld A, B en E) die de klant zeker moet hebben en bijvoorbeeld module D die hij optioneel kan hebben.

Om dit op te lossen heb ik eigenlijk iets nodig zoals de query in mijn eerste post (het controleren op MODULE_ID). Uiteraard kan ik niet controleren op meerdere module_id's in 1 query, want binnen 1 record kan MODULE_ID maar 1 waarde hebben.

Ik hoop dat het nu een beetje duidelijker is :)

  • ProgrammerX
  • Registratie: Juli 2002
  • Laatst online: 26-02-2021
Verwijderd schreef op 13 November 2002 @ 11:57:
SELECT K.*
FROM KLANTEN K, KLANT_MOD KM
WHERE (KM.KLANT_ID = K.KLANT_ID)
AND (KM.MODULE_ID = 1)
UNION
SELECT K.*
FROM KLANTEN K, KLANT_MOD KM
WHERE (KM.KLANT_ID = K.KLANT_ID)
AND (KM.MODULE_ID = 3)
UNION
SELECT K.*
FROM KLANTEN K, KLANT_MOD KM
WHERE (KM.KLANT_ID = K.KLANT_ID)
AND (KM.MODULE_ID = 6)

Ps traag als dikke stront maar dit is wat ik uit je verhaal begrijp
Tuurlijk !! :)

Sorry, ben net een aantal dagen ziek geweest, m'n verstand is blijkbaar nog niet terug op volle toeren ;)

Bedankt!

P.S. Kom er net achter dat de union functie pas werkt in versie 4.0 van MYSQL :'(

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
-edit- nee dat klopt niet
Verwijderd schreef op 13 november 2002 @ 11:57:
SELECT K.*
FROM KLANTEN K, KLANT_MOD KM
WHERE (KM.KLANT_ID = K.KLANT_ID)
AND (KM.MODULE_ID = 1)
UNION
SELECT K.*
FROM KLANTEN K, KLANT_MOD KM
WHERE (KM.KLANT_ID = K.KLANT_ID)
AND (KM.MODULE_ID = 3)
UNION
SELECT K.*
FROM KLANTEN K, KLANT_MOD KM
WHERE (KM.KLANT_ID = K.KLANT_ID)
AND (KM.MODULE_ID = 6)

Ps traag als dikke stront maar dit is wat ik uit je verhaal begrijp
Nu selecteer je alle klanten die 1 hebben, alle klanten die 3 hebben en alle klanten die 6 hebben. Aan de eis van minimaal 1+3 voldoe je nu niet.

  • ProgrammerX
  • Registratie: Juli 2002
  • Laatst online: 26-02-2021
Glimi schreef op 13 november 2002 @ 12:10:
SQL:
1
2
3
4
5
SELECT K.*
FROM KLANTEN K, KLANT_MOD KM
WHERE KM.KLANT_ID = K.KLANT_ID
AND KM.MODULE_ID IN (1, 3)
OR KM.MODULE_ID IN (1,3,6)

Gaat iets sneller als een UNION heb ik het idee ;)
Hij gaat inderdaad sneller en ik hoef MySQL niet te upgraden :)

Bedankt !

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
ProgrammerX schreef op 13 November 2002 @ 12:14:
Hij gaat inderdaad sneller en ik hoef MySQL niet te upgraden :)

Bedankt !
Probleem is alleen dat hij niet voldoet. Je selecteert nu namelijk ook alle klanten mee die alleen 1 hebben

dit werkt wel, maar ik weet niet of dat gaat werken in uw MySQL versie:
SQL:
1
2
3
4
5
6
7
8
9
SELECT K.*
FROM KLANTEN K, KLANT_MOD KM
WHERE (KM.KLANT_ID = K.KLANT_ID)
AND (KM.MODULE_ID = 1)
INTERSECT
SELECT K.*
FROM KLANTEN K, KLANT_MOD KM
WHERE (KM.KLANT_ID = K.KLANT_ID)
AND (KM.MODULE_ID = 3)

Verwijderd

Helaas Glimi, jouw query geeft teveel records terug. (Klanten die alleen A hebben worden ook getoont.) Probeer dit eens:

SELECT K.*
FROM KLANTEN K, KLANT_MOD KM1, KLANT_MOD KM2
WHERE K.KLANT_ID = KM1.KLANT_ID
AND K.KLANT_ID = KM2.KLANT_ID
AND KM1.MODULE_ID = 1
AND KM2.MODULE_ID = 3;

D is optioneel dus is in de query niet van belang. De Klanten die je nu opvraagt hebben in ieder geval A en B.

  • ProgrammerX
  • Registratie: Juli 2002
  • Laatst online: 26-02-2021
Glimi schreef op 13 November 2002 @ 12:19:
[...]

Probleem is alleen dat hij niet voldoet. Je selecteert nu namelijk ook alle klanten mee die alleen 1 hebben

dit werkt wel, maar ik weet niet of dat gaat werken in uw MySQL versie:
SQL:
1
2
3
4
5
6
7
8
9
SELECT K.*
FROM KLANTEN K, KLANT_MOD KM
WHERE (KM.KLANT_ID = K.KLANT_ID)
AND (KM.MODULE_ID = 1)
INTERSECT
SELECT K.*
FROM KLANTEN K, KLANT_MOD KM
WHERE (KM.KLANT_ID = K.KLANT_ID)
AND (KM.MODULE_ID = 3)
Helaas staat de intersect nog op het verlanglijstje van MySQL :(

Ik probeer nog wel even met de tips die ik heb dusver :)

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

Goodielover

Only The Best is Good Enough.

Moeilijk hé
hier is de oplossing dan.
Ten eerste doet module D er helemaal niet toe.
Als je die toch wilt weten, dan kan dat wel.

code:
1
2
3
4
5
6
7
8
9
SELECT K.KLANT_ID
      ,K.NAAM
      ,SUM(DECODE(KM.MODULE_ID,1,1,3,1,6,.5,0)) codering_modules
FROM   KLANTEN K
      ,KLANT_MOD KM
WHERE  KM.KLANT_ID = K.KLANT_ID
AND    KM.MODULE_ID IN (1,3,6)
GROUP BY K.KLANT_ID, K.NAAM
HAVING codering_modules in (2,2.5)

Je sommeert dus het aantal modules dat voldoet.
Komt er 2 uit dan is het alleen A&B is het 2.5 dan is het A&B&D
Dudeluk?

  • ProgrammerX
  • Registratie: Juli 2002
  • Laatst online: 26-02-2021
Goodielover schreef op 13 november 2002 @ 14:33:
Moeilijk hé
hier is de oplossing dan.
Ten eerste doet module D er helemaal niet toe.
Als je die toch wilt weten, dan kan dat wel.

code:
1
2
3
4
5
6
7
8
9
SELECT K.KLANT_ID
      ,K.NAAM
      ,SUM(DECODE(KM.MODULE_ID,1,1,3,1,6,.5,0)) codering_modules
FROM   KLANTEN K
      ,KLANT_MOD KM
WHERE  KM.KLANT_ID = K.KLANT_ID
AND    KM.MODULE_ID IN (1,3,6)
GROUP BY K.KLANT_ID, K.NAAM
HAVING codering_modules in (2,2.5)

Je sommeert dus het aantal modules dat voldoet.
Komt er 2 uit dan is het alleen A&B is het 2.5 dan is het A&B&D
Dudeluk?
Helaas denk ik niet dat dit gaat werken in MySQL, sinds Decode een eigen functie van MYSQL is om een password mee te versleutelen.

Met de intersect krijg ik het wel opgelost, mar ook dat werkt weer niet in MySQL :(

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

Goodielover

Only The Best is Good Enough.

Hallo zeg, dan doe je dat met een IIF-statement oid. Moet ik echt alles voor jou doen? :)
kijk hier maar eens:
http://www.mysql.com/doc/en/Control_flow_functions.html

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

Goodielover schreef op 13 november 2002 @ 14:44:
Hallo zeg, dan doe je dat met een IIF-statement oid. Moet ik echt alles voor jou doen?

rustig ;)

Doet iets met Cloud (MS/IBM)


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

Goodielover

Only The Best is Good Enough.

Ik ben wel rustig. Kwam ik boos over?
Ik had het gevoel een 99% oplossing te geven, en hij geeft commentaar over die 1%. En geen reactie op de 99%.

Ik heb de post nog even aangevuld met een link naar documentatie, kan hij weer verder.

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

Goodielover schreef op 13 November 2002 @ 14:53:
[...]

Ik ben wel rustig. Kwam ik boos over?
Ik had het gevoel een 99% oplossing te geven, en hij geeft commentaar over die 1%. En geen reactie op de 99%.

Ik heb de post nog even aangevuld met een link naar documentatie, kan hij weer verder.

beetje geirriteerd ;)

Doet iets met Cloud (MS/IBM)


Verwijderd

Ik ben ook geirriteerd!
Waarom negeert iedereen mijn oplossing die ik op "Wednesday 13 November 2002 12:25" heb gepost. Ik zal nog eens mijn energie op deze wijze verspillen :(

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op 14 November 2002 @ 09:58:
Ik ben ook geirriteerd!
Waarom negeert iedereen mijn oplossing die ik op "Wednesday 13 November 2002 12:25" heb gepost. Ik zal nog eens mijn energie op deze wijze verspillen :(

Rustig maar :)

Volgens mij is iig jouw oplossing het makkelijkst/haalbaarst in MySQL :)
Pagina: 1