Toon posts:

-MYSQL- Meerdere waarden uit 1 veld.

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo allemaal,

ik heb een probleem met een mysql query. Ik krijg het namelijk niet voor elkaar meerdere waarden uit hetzelfde veld aan een bepaalde code te koppelen.

Het probleem zit hem als volgt inelkaar:

Ik heb drie tabellen:

1 Accommodatie(accommodatiecode, naam, ..........);
2 Accommodatie_Faciliteit(accommodatiecode, faciliteitnr);
3 Faciliteit(Faciliteitnr, omschrijving);

Accommodatie_Faciliteit is een Matrix Tabel welke zorgt voor de onderlinge koppeling tussen Accommodatie en Faciliteit.

Nu wil ik met behulp van een query bepalen of bijv. faciliteit 1, 3 en 7 voorkomen bij een bepaalde accommodatie. Daarvoor had ik de volgende query in het leven geroepen:

SELECT * FROM accommodatie a, accommodatie_faciliteit b, faciliteit c WHERE a.accommodatiecode = b.accommodatiecode AND c.faciliteitnr = b.faciliteitnr and (b.faciliteitnr = 1 AND b.faciliteitnr = 3 AND b.faciliteitnr = 7);

Helaas werkt dit dus niet.......terwijl ik zeker weet dat er accommodaties zijn die over beide faciliteiten beschikken.

Hopelijk kan iemand me hier helpen, ik heb ondertussen al vanalles geprobeerd om achter het antwoord te komen.

Greetz Helgo.

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
code:
1
(b.faciliteitnr = 1 AND b.faciliteitnr = 3 AND b.faciliteitnr = 7);

Hoe kan 1 code uit 1, 3 en 7 bestaan?

Verwijderd

Dit werkt wel als het goed is:

SELECT * FROM accommodatie a, accommodatie_faciliteit b, faciliteit c WHERE a.accommodatiecode = b.accommodatiecode AND c.faciliteitnr = b.faciliteitnr AND b.faciliteitnr IN (1,3,7);

[edit]
Maar als je alleen op het voorkomen wil checken is dit beter:

SELECT COUNT(b.*) FROM accommodatie a, accommodatie_faciliteit b, faciliteit c WHERE a.accommodatiecode = b.accommodatiecode AND c.faciliteitnr = b.faciliteitnr AND b.faciliteitnr IN (1,3,7);

Verwijderd

Topicstarter
Nee helaas NextGeneration, nu krijg ik alle accommodaties die of 1 of 3 of 7 bevatten, dit had ik btw ook al geprobeerd...............helaas.

Verwijderd

Dan zal je met een view moeten werken, dus je heb een result en daar laat je weer een query op los.

Verwijderd

Verwijderd schreef op 01 november 2002 @ 14:55:
Nee helaas NextGeneration, nu krijg ik alle accommodaties die of 1 of 3 of 7 bevatten, dit had ik btw ook al geprobeerd...............helaas.
Het ging toch om 1 bepaalde accommodatie?

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Had ik je niet aangeraden om eerst de FAQ te lezen voordat je ging posten :+ Meteen maar even een tip geven :

• Geen groeten. Tweakers doen elkaar permanent de groeten :)
• Onderwerp tussen blokhaken, niet streepjes

Kon het niet laten dit even te zeggen.

Verder moet ik zeggen dat ik dit echt een vaag probleem vind. Heb het gister ook al even lopen bestuderen, ben nou ook niet echt een SQL-held, maar dit vind ik wel erg vaag.

Mother, will they like this song?


Verwijderd

Topicstarter
Hmmzzzz, ja, maar dat is dus net wat ik niet wil.............

Ik heb namelijk een zoekformulier gemaakt (php) waarbij je kunt zoeken op faciliteiten. Hierbij moeten alle accommodatiecode's voor de dag welke alle (gezochte) faciliteiten bevatten.

Omdat dit niet het enige is waar je op kunt zoeken, heb ik de query variabel gemaakt waardoor alle mogelijkheden (1024) in die query gestopt wordt en het juiste resultaat geeft. Overal behalve bij faciliteiten, omdat ik die query maar niet juist opgebouwd krijg.

Maar, dit moet toch gewoon kunnen met mysql of niet soms............ik heb zelfs het idee dat de oplossing vrij simpel moet zijn...........of niet??????

Greetz Helgo.

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
TheLunatic schreef op 01 november 2002 @ 15:00:
Had ik je niet aangeraden om eerst de FAQ te lezen voordat je ging posten :+ Meteen maar even een tip geven :

• Geen groeten. Tweakers doen elkaar permanent de groeten :)
• Onderwerp tussen blokhaken, niet streepjes

Kon het niet laten dit even te zeggen.

Verder moet ik zeggen dat ik dit echt een vaag probleem vind. Heb het gister ook al even lopen bestuderen, ben nou ook niet echt een SQL-held, maar dit vind ik wel erg vaag.
Als je niets toe te voegen hebt, dan hoef je dus ook niet te reageren.

Ontopic: wil je nou dat hij in 1, 3 OF 7 zit. Of wil je alle records terug waarbij mensen 3 accomodaties hebben?

Verwijderd

Je kan natuurlijk ook voor elke faciliteitnr een query uitvoeren waarin je kijkt of het accommodatienr voorkomt (in dat result dus).

Verwijderd

Topicstarter
Ik wil alle accommodatiecodes zien welke zowel faciliteit 1, 3 als 7 bezitten.
Voorbeeld:

Tabel Accommodatie_Faciliteit:
Accommodatiecode - NBR-09 Faciliteitnr - 1
Accommodatiecode - NBR-09 Faciliteitnr - 2
Accommodatiecode - NBR-09 Faciliteitnr - 3
Accommodatiecode - NBR-09 Faciliteitnr - 7
Accommodatiecode - NBR-18 Faciliteitnr - 1
Accommodatiecode - NBR-18 Faciliteitnr - 3

In dit geval wil ik dus dat ie alleen met accommodatie NBR-09 voor de dag komt..........

  • Delvi
  • Registratie: November 2002
  • Laatst online: 26-08 20:12
In hoeverre is MySql gelijk aan (MS) SQL??

Dan zou je de Instr() functie kunnen gebruiken om te kijken of er een stukje string in het veld zit.

Je krijgt dan iets in de geest van:
WHERE Instr(Faciliteitnr, 1) > 0

Voor meerdere faciliteiten zet je er een OR achter en ga je weer verder met een Instr().

Dit werkt natuurlijk alleen als MySql de Instr() functie ook kent!

You can make your program idiot prove. Then someone will develop a better idiot


  • Nielsz
  • Registratie: Maart 2001
  • Niet online
code:
1
select  i.status,i.poster,i.timestamp,i.titel, t1.value,t2.value,i.ReactionCounter,i.categoryId from items i left join texts t1 on (t1.itemid=i.id and t1.kindoftext=1) left join texts t2 on (t2.itemid=i.id and t2.kindoftext=2) where i.id=1

Dit is een query die ik gebruik om alle items op te halen die zowel een record in 'items' hebben, en 2 records in 'texts' waarvan de ene 'kindoftext=1' en de andere 'kindoftext=2'.


Succes met ombouwen :)

Verwijderd

Topicstarter
Hmmzzzz, Instr() werkt wel, maar wanneer ik bijv. instr(faciliteitnr, 1) > 0 gebruik, komt ie terug met records zoals faciliteitnr is 1, 11, 19, 16 enz. Alles dus waar een 1 voor staat.....

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Delvi schreef op 01 november 2002 @ 15:15:
In hoeverre is MySql gelijk aan (MS) SQL??

Dan zou je de Instr() functie kunnen gebruiken om te kijken of er een stukje string in het veld zit.

Je krijgt dan iets in de geest van:
WHERE Instr(Faciliteitnr, 1) > 0

Voor meerdere faciliteiten zet je er een OR achter en ga je weer verder met een Instr().

Dit werkt natuurlijk alleen als MySql de Instr() functie ook kent!
Het zijn verschillende records, dus dit gaat niet op.

Verwijderd

Topicstarter
Hey tnx Nielsz, ik ga proberen of het werkt, zo ja........dan kom ik je hier weer bedanken ;). Ben al een paar dagen bezig met dit gedoe...........en het MOET gewoon werken........

  • Delvi
  • Registratie: November 2002
  • Laatst online: 26-08 20:12
Daar heb je gelijk in. Dit is op te lossen door zowel voor als achter de waarde een ; (puntcomma) neer te zetten (een ander teken kan natuurlijk ook).

Je krijgt dan iets van:
WHERE Instr(";" & Cstr(Faciliteitnr) & ";", ";1;") > 0

Hiermee voorkom je dat je in de string 13 ook de 1 ziet, omdat de string dan is ;13; en die is ongelijk aan ;1;

Het is misschien een rare workaround, maar het werkt wel.

Je houdt er inderdaad wel meerdere records aan over.

You can make your program idiot prove. Then someone will develop a better idiot


  • Nielsz
  • Registratie: Maart 2001
  • Niet online
:X :)
Er zijn dus drie records, eentje met 1 eentje met 3 een eentje met 7. Je wilt alleen de ID's terug van de accommodatie die ze alledrie heeft. Met die vage query van jou krijg je ze terug als het OF 1 of 3 of 7 is. Je wilt het ID alleen terug als ze alledrie bestaan.


topicstarter: Laat je ff weten als het gelukt is? :)

Verwijderd

Probeer het eens met:

select A.naam from Accommodatie A
where exist (select 1 from Accommodatie_Faciliteit AF where AF.accommodatiecode = A.accommodatiecode and AF.faciliteitnr =1)
and exist (select 1 from Accommodatie_Faciliteit AF where AF.accommodatiecode = A.accommodatiecode and AF.faciliteitnr =3)
and exist (select 1 from Accommodatie_Faciliteit AF where AF.accommodatiecode = A.accommodatiecode and AF.faciliteitnr =7);

Graag gedaan ;-)

[ Voor 0% gewijzigd door Verwijderd op 01-11-2002 15:40 . Reden: overzichtelijker ]


Verwijderd

Topicstarter
Hmmzzz, ik snap die select 1 niet MrDreamOn????

Verwijderd

Topicstarter
Ik heb ook nog problemen met die uitwerking van jouw Nielsz, ik krijg hem in ieder geval niet omgebouwd tot een query welke mij de juiste resultaten geeft :(.

Kun je me misschien vertellen welke items in welke tabel voorkomen, dan wordt het denk ik een stuk duidelijker voor me.

Verwijderd

Verwijderd schreef op 01 november 2002 @ 15:43:
Hmmzzz, ik snap die select 1 niet MrDreamOn????
De exist functie kijkt of er een record bestaat die aan jouw selectie voldoet en geeft een True or False terug.
Het maakt dus niet uit of je hier een 1, een *, een ander waarde zoals 'BESTAAT' of een veldnaam invult.

Als alle exists functie een True terug geven dan krijg jij je accommodatie-naam te zien.

Ben momenteel met veel zwaardere query bezig ;-)

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
MrDreamon: bestaat exist wel in Mysql? :)

Wacky: ik ga ff voor je kijken.

Verwijderd

SORRY !!!! ik bedoel EXISTS ipv exist ..............

In Oracle zou het dan prima moeten werken.
Het is standaard SQL, dus ik denk dat het ook in MySql werkt.

Verwijderd

Topicstarter
MySQL retourneerde:

You have an error in your SQL syntax near '(select 1 from Accommodatie_Faciliteit b where
b.accommodatiecode = a.accommodat' at line 2

Dit krijg ik dus terug als ik in PhpMyAdmin de query probeer uit te voeren?!

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT 
   af.*, a1.*, a2.*, a3.*,f.* 
FROM 
    faciliteit c,
    accommodatie_faciliteit af
LEFT JOIN
    accommodatie a1 on (a1.accomodatiecode = af.accommodatiecode and a1.faciliteitnr = 1)
LEFT JOIN
    accommodatie a2 on (a2.accomodatiecode = af.accommodatiecode and a2.faciliteitnr = 3)
LEFT JOIN
    accommodatie a3 on (a3.accomodatiecode = af.accommodatiecode and a3.faciliteitnr = 7)
WHERE
    f.faciliteitnr=af.faciliteitnr

Er zullen best wat fouten in zitten :)

  • pioneer5
  • Registratie: Februari 2000
  • Laatst online: 06-07-2021
Wat je ook kan doen is een SELECT op alle accomodaties die IN (1,3,7) zijn, en deze groupen met een COUNT(*)=3. Dan krijg je alleen de accomodaties terug die alledrie de faciliteiten hebben. Geen idee of dit efficient is trouwens...

SELECT *
FROM accommodatie a, accommodatie_faciliteit b, faciliteit c
WHERE a.accommodatiecode = b.accommodatiecode AND c.faciliteitnr = b.faciliteitnr AND b.faciliteitnr IN (1,3,7)
AND COUNT(*) = 3
GROUP BY a.accomodatiecode

ps. Mysql ondersteunt geen subqueries, dus EXISTS werkt niet

Verwijderd

Heb je exist veranderd in EXISTS ?

Zo ja, dan zijn de verschillen tussen MySQL en Oracle toch groter dan ik dacht. (en kan ik je helaas niet meer helpen omdat ik nog nooit gewerkt heb met MySQL)

Verwijderd

Topicstarter
HA HA HA HA HA HA HA HA HA,

Dankjewel Pioneer5......je gaf me de voorzet, en ik kopte hem in.
Je idee van die group by en telling (count(*) gaf met het volgende idee:

SELECT *
FROM accommodatie a, accommodatie_faciliteit b, faciliteit c
WHERE a.accommodatiecode = b.accommodatiecode AND c.faciliteitnr = b.faciliteitnr AND
b.faciliteitnr IN (1,3,7) GROUP BY a.accommodatiecode HAVING Count(*) =3;

En dit geeft me dus precies wat ik wilde weten..........oh yeah........i'm one happy camper nu.

Verwijderd

Topicstarter
Allemaal bedankt voor jullie hulp, ik had ook al wat forumpjes gestart op http://www.php-forum.com, maar daar reageren ze lang niet zo snel als hier en bovendien komen ze niet met zulke antwoorden ;).

Moraal van het verhaal, voortaan post ik mijn probleempjes direct hier ;)

Prettig weekend allemaal...........

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
En als je nou 3 records hebt met allemaal nummer 7? :)
Maar ik ben wel benieuwd of mijn code werkt eigenlijk ;)

  • pioneer5
  • Registratie: Februari 2000
  • Laatst online: 06-07-2021
Nielsz, ik neem aan dat iedere faciliteit maar 1x voorkomt per accomodatie.

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
pioneer5 schreef op 01 november 2002 @ 16:15:
Nielsz, ik neem aan dat iedere faciliteit maar 1x voorkomt per accomodatie.
ja, dat neem je aan. Maar als de 'uniques' niet goed zijn ingesteld ben je de lul :)

Verwijderd

Topicstarter
Die staan goed ingesteld hoor Nielsz, maak je maar geen zorgen ;).

Ik heb hier maar 2 woorden voor "Referential Integrity" :)

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Maar werkt mijn query nou? :)

Verwijderd

Topicstarter
Nou, ik heb het net geprobeerd, hier en daar wat aanpassingen, maar ik krijg er alleen maar mysql errors uit..........sorry.

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
beetje jammer :{

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 30-08 10:19

Dido

heforshe

The hard way?
code:
1
2
3
4
5
6
7
8
9
10
11
SELECT DISTINCT a.*
FROM accommodatie a,
     accommodatie_faciliteit b,
     accommodatie_faciliteit c,
     accommodatie_faciliteit d
WHERE a.accommodatiecode = b.accommodatiecode 
  AND a.accommodatiecode = c.accommodatiecode 
  AND a.accommodatiecode = d.accommodatiecode 
  AND b.faciliteitnr = 1 
  AND c.faciliteitnr = 3 
  AND d.faciliteitnr = 7;

[/quote]
Ik zie f niet zo snel waarom je je tabel aciliteit eraan hangt, aangezien je het ID nummer ervan al kent en dus waarschijnlijk al weet wat de omschrijving ervan is. Als je op omschrijving selecteert of hem er om een andere reden toch aan wilt hangen, voeg je'm toe als "e"; vergeet dan niet hem ook aan b, c, d te hangen :)

Wat betekent mijn avatar?


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-08 09:55

Creepy

Tactical Espionage Splatterer

Omdat MySQL geen subqueries ondersteunt werkt de query van DreamOn niet.

En voor zover ik de vraag van de topicstarter snap is deze query NIET op te lossen zonder subquery. Kijk eens naar de MySQL handleiding, daar staat dit namelijk gewoon in, plus wat voorbeelden van queries die zijn omschreven van meedere queries naar 1 enkele query.

Je zal 1 en ander in je code moeten oplossen i.p.v. door SQL.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Creepy, leg mij eens uit waarom mijn query niet zo werken dan?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-08 09:55

Creepy

Tactical Espionage Splatterer

Geen idee.. als ik hem zo bekijk zou hij best wel eens kunnen werken.

De reden waarom ik zeg dat je dit met meer dan alleen SQL kan doen is omdat het een search is. Een gebruiker kan dus best wel eens 1,2,6 of 7 accomodaties opgeven, zodat je runtime een complete query moet samenstellen. (meer dan bijv. alleen een paar var's in de where clause neerzetten)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1