mysql select probleem

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • ton08
  • Registratie: Maart 2017
  • Laatst online: 22-04-2018
Hoe los ik het volgende op:

ik heb een bestandje met de volgende inhoud:

VidSid
12
14
23
34


$in bevat de string (2,4)

Dit is de query
$stmt2 = mysqli_prepare($conn,
"SELECT t1.Adres, t1.Vid, t1.Plaats
FROM locaties as t1, koppel_loc_wat as t2
WHERE t1.Vid = t2.Vid and t2.Sid IN $in
group by t1.Vid order by t1.Adres");

Deze query geeft het resultaat waar Sid=2 of 4. Vid boeit daarbij niet.
Ik zou graag willen dat Vid wel wordt meegenomen. Dan zou de uitkomst 1 zijn omdat 2 en 4 beide voorkomen als Vid =1.

Hoe doe ik dit?

Beste antwoord (via ton08 op 09-03-2017 19:39)


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 20:09

Dido

heforshe

Om te beginnen een stukje leesbaarheid en onderhoudbaarheid: gebruik een expliciete join in plaats van een impliciete. Dat gaat je veel tijd schelen als je in de toekomst uitgebreide queries moet onderhouden en je afvraagt wat er niet werkt terwijl blijkt dat je een join-clause vergeten bent tussen de 50 andere onderdelen van je where-clause.

Vervolgens komt natuurlijk het punt van je GROUP BY. In elke normale versie van SQL kan dit helemaal niet, en er is niemand die zeker kan weten wat je denkt te bereiken met deze GROUP BY. OMdat je vraag daar niet over gaat laat ik hem maar even weg. Je query wordt dan:

code:
1
2
3
4
5
6
7
SELECT t1.Adres
     , t1.Vid
     , t1.Plaats
FROM locaties as t1
JOIN koppel_loc_wat as t2 ON t1.Vid = t2.Vid 
WHERE t2.Sid IN (2, 4)
GROUP BY t1.Vid


Als ik dan ook nog even weglaat wat je verder niet toelicht en waar je vraag niet over lijkt te gaan kunnen we je query vereenvoudigen tot:
code:
1
2
3
4
5
SELECT t1.Adres
     , t1.Vid
     , t1.Plaats
FROM locaties as t1
WHERE t1.Sid IN (2, 4)

Let op dat ik t.SiD gebruikt heb, t2 (koppel_loc_wat) komt verder nergens in je vraag voor.

Als je dit doet:
code:
1
2
3
4
5
SELECT Vid, count(*)
FROM locaties
WHERE Sid in (2,4)
GROUP BY Vid
HAVING Count(*) = 2

Dan krijg je alle Vids (in dit geval alleen 1) die aan je gestelde voorwaarden voldoen.

Op basis van die query kunt je dan weer je op Vid gebaseerde data selecteren.

Uiteraard moet je (2,4) en count(*) = 2 nog wel vervangen door jouw input en het aantal items in jouw input.

[ Voor 4% gewijzigd door Dido op 09-03-2017 15:50 ]

Wat betekent mijn avatar?

Alle reacties


Acties:
  • 0 Henk 'm!

  • xleeuwx
  • Registratie: Oktober 2009
  • Laatst online: 19-09 17:48

xleeuwx

developer Tweakers Elect
ten eerste zet je code even tussen code tags. Daarnaast missen we nog wat informatie over de andere tabel.

Acties:
  • 0 Henk 'm!

  • CCJJVV
  • Registratie: Maart 2016
  • Laatst online: 13:12
Dus als ik het goed begrijp wil je als uitkomst de waarde van Vid hebben waarvoor Sid zowel de waarde 2 als 4 heeft? Vid = 3 heeft wel waarde 4 maar niet waarde 2 dus die zou dan niet getoond moeten worden?

[ Voor 3% gewijzigd door CCJJVV op 09-03-2017 15:11 ]


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 20:09

Dido

heforshe

Om te beginnen een stukje leesbaarheid en onderhoudbaarheid: gebruik een expliciete join in plaats van een impliciete. Dat gaat je veel tijd schelen als je in de toekomst uitgebreide queries moet onderhouden en je afvraagt wat er niet werkt terwijl blijkt dat je een join-clause vergeten bent tussen de 50 andere onderdelen van je where-clause.

Vervolgens komt natuurlijk het punt van je GROUP BY. In elke normale versie van SQL kan dit helemaal niet, en er is niemand die zeker kan weten wat je denkt te bereiken met deze GROUP BY. OMdat je vraag daar niet over gaat laat ik hem maar even weg. Je query wordt dan:

code:
1
2
3
4
5
6
7
SELECT t1.Adres
     , t1.Vid
     , t1.Plaats
FROM locaties as t1
JOIN koppel_loc_wat as t2 ON t1.Vid = t2.Vid 
WHERE t2.Sid IN (2, 4)
GROUP BY t1.Vid


Als ik dan ook nog even weglaat wat je verder niet toelicht en waar je vraag niet over lijkt te gaan kunnen we je query vereenvoudigen tot:
code:
1
2
3
4
5
SELECT t1.Adres
     , t1.Vid
     , t1.Plaats
FROM locaties as t1
WHERE t1.Sid IN (2, 4)

Let op dat ik t.SiD gebruikt heb, t2 (koppel_loc_wat) komt verder nergens in je vraag voor.

Als je dit doet:
code:
1
2
3
4
5
SELECT Vid, count(*)
FROM locaties
WHERE Sid in (2,4)
GROUP BY Vid
HAVING Count(*) = 2

Dan krijg je alle Vids (in dit geval alleen 1) die aan je gestelde voorwaarden voldoen.

Op basis van die query kunt je dan weer je op Vid gebaseerde data selecteren.

Uiteraard moet je (2,4) en count(*) = 2 nog wel vervangen door jouw input en het aantal items in jouw input.

[ Voor 4% gewijzigd door Dido op 09-03-2017 15:50 ]

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • ton08
  • Registratie: Maart 2017
  • Laatst online: 22-04-2018
CCJJVV dat is precies wat ik zoek. Dido je hebt gelijk wat betreft de expliciete en impliciete joins. ik ben een beginner en moet dit soort zaken eerst nog opzoeken. Wat ik zoek is wat CCJJVV schrijft.

[ Voor 71% gewijzigd door ton08 op 09-03-2017 15:55 ]


Acties:
  • 0 Henk 'm!

  • CCJJVV
  • Registratie: Maart 2016
  • Laatst online: 13:12
ton08 schreef op donderdag 9 maart 2017 @ 15:39:
CCJJVV dat is precies wat ik zoek. Dido je hebt gelijk wat betreft de expliciete en impliciete joins. ik ben een beginner en moet dit soort zaken eerst nog opzoeken. Wat ik zoek is wat CCJJVV schrijft.
Het laatste stukje code van DIDO is wat je nodig zal hebben.
Pagina: 1