login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Meerdere id's hebben (Opgelost)

Offline prienstra - 10/02/2010 21:53
Avatar van prienstraMySQL interesse Beste mensen,

Ik heb een tabel

onderdeel_id | fiets_id
1 | 1
2 | 1
3 | 2
4 | 2
5 | 1

Nu wil ik de fiets_id die onderdeel_id 1 & 2 & 5 hebben.

Zoiets:
  1. SELECT fiets_id FROM fietsen WHERE onderdeel_id = ('1', '2','5');


Maar dat werkt niet. Bestaat er zo'n formule?

14 antwoorden

Gesponsorde links
Offline vinTage - 10/02/2010 22:16
Avatar van vinTage Nieuw lid WHERE onderdeel_id IN (1, 2, 5)
Offline larssy1 - 10/02/2010 22:27
Avatar van larssy1 MySQL beginner @prienstra
voor extra info.. er zijn zowiezo al geen ( ) tags achter een = 
Offline prienstra - 10/02/2010 22:29 (laatste wijziging 10/02/2010 22:30)
Avatar van prienstra MySQL interesse @larssy --> was ook een voorbeeldje om het duidelijk te maken.

Ik heb nu:

  1. $sql1 = mysql_query("SELECT fiets_id FROM fietsen WHERE onderdeel_id IN (1, 2, 10000) GROUP BY fiets_id;");
  2.  
  3. while($row = mysql_fetch_array($sql1)) {
  4.  
  5. echo "$row[fiets_id]<br/>";
  6.  
  7. }


Maar dat werkt niet correct, want 1000 bestaat niet, en toch krijg ik fiets_id's te zien.
Offline Abbas - 10/02/2010 22:33 (laatste wijziging 10/02/2010 22:35)
Avatar van Abbas Gouden medaille

Crew .NET
Ok, maar wat als je dan deze gegevens hebt?

onderdeel_id | fiets_id
1 | 1
2 | 3
3 | 2
4 | 2
5 | 1

Dan is die IN niet meer juist want je wil alleen fiets_id 1 en niet 3.

Edit:
Daarom dat ik al zei dat het niet helemaal juist is. Je gebruikt IN, vanaf dat er een fiets_id is met een onderdeel_id dat in de meegegeven mogelijkheden valt krijg je een ID terug. Daarom dat IN niet helemaal juist is.
Offline prienstra - 10/02/2010 22:40
Avatar van prienstra MySQL interesse Ik wil de fiets_id waar onderdeel_id 1,2,5 in zitten:

id | onderdeel_id | fiets_id
1 | 1 | 1
2 | 2 | 1
3 | 3 | 2
4 | 4 | 2
5 | 5 | 1
6 | 2 | 2


In dit geval enkel fiets 1
Offline Tuinstoel - 10/02/2010 23:05 (laatste wijziging 10/02/2010 23:06)
Avatar van Tuinstoel PHP expert
  1. SELECT DISTINCT fiets_id
  2. FROM fietsen f
  3. HAVING (
  4. SELECT COUNT(*) FROM fietsen x WHERE x.onderdeel_id IN(1,2,5) AND x.fiets_id = f.fiets_id )
  5. >= 3


De 3 representeert het aantal onderdelen (in je array o.i.d.) dat kun je wel met php uitlezen.

Ik heb diverse dingen geprobeerd en ik weet ook niet zeker of dit wel compatibele is met een grotere tabel, maar voor je voorbeeldtabel werkt het zeker ;).
Offline prienstra - 11/02/2010 10:04 (laatste wijziging 11/02/2010 10:06)
Avatar van prienstra MySQL interesse $tuinstoel werkt goed!

Ik wil hem nog iets uitbreiden, ik wil de naam van de fiets weergeven. Deze staat in een andere tabel. Ik heb nu:

  1. $sql2 = mysql_query("SELECT DISTINCT g.naam
  2. FROM fietsen f, fiets g
  3. HAVING (
  4. SELECT COUNT(*) FROM fietsen x WHERE x.onderdeel_id IN($zoek) AND x.fiets_id = f.fiets_id AND g.fiets_id = x.fiets_id) >= $aantal;");
  5.  
  6. while($row = mysql_fetch_array($sql2)) {
  7.  
  8. echo "$row[naam]<br/>";
  9.  
  10. }

Dit werkt, maar de query is extreeeeeem traaaaag. Is daar een andere oplossing voor?
Offline larssy1 - 11/02/2010 10:21
Avatar van larssy1 MySQL beginner je code klopt niet helemaal.. je echo op regel 8 is fout

zet er dit neer:
echo $row['naam']. "<br />";
Offline prienstra - 11/02/2010 10:34
Avatar van prienstra MySQL interesse @larssy1 --> bedankt voor je tip!

Maar de snelheid wordt er niet beter van  
Offline larssy1 - 11/02/2010 11:13
Avatar van larssy1 MySQL beginner
prienstra schreef:
@larssy1 --> bedankt voor je tip!

Maar de snelheid wordt er niet beter van  

maar wel een betere/nettere code, en dat is ook belangrijk 

Kwa de snelheid van je query, ik denk niet echt dat je daaraan veel kunt veranderen.
Offline nick5556 - 11/02/2010 16:09
Avatar van nick5556 PHP beginner Misschien werkt dit:

  1. tabel 1:
  2.  
  3. ID | fiets_merk |
  4. 1 | * |
  5. 2 | * |
  6. 3 | * |
  7.  
  8. tabel 2:
  9.  
  10. ID | onderdeel |
  11. 1 | * |
  12. 2 | * |
  13. 3 | * |
  14.  
  15. tabel 3:
  16.  
  17. FID | OID
  18. 1 | 2
  19. 1 | 3
  20. 2 | 1
  21. 3 | 1
  22. 3 | 3


als je in je code alle onderdelen van fiets 1 nodig hebt, dan kijk je welke onderdelen er bij horen, die staan in tabel 3. In dit geval is dat 2 en 3, dan de onderdelen ophalen uit tabel 1.

Is dat niet sneller, of is dat te omslachtig?
Offline Abbas - 11/02/2010 16:26
Avatar van Abbas Gouden medaille

Crew .NET
Dat is niet omslachtig maar het omgekeerde van wat hij nodig heeft. Wat jij voorstelt is correct als je op basis van fietsId de onderdelen gaat ophalen. Hij moet op basis van de onderdelen een fietsId ophalen. Snap je?
Offline Tuinstoel - 11/02/2010 18:49 (laatste wijziging 11/02/2010 18:53)
Avatar van Tuinstoel PHP expert Je query is zo traag omdat het een subquery betreft (query in query). Ik denk dat je er niks aan kunt doen, of je moet kijken naar een andere oplossing van je probleem bijvoorbeeld.

Je query is overigens nog fout mijn inziens:
AND g.fiets_id = x.fiets_id

Dat hoort _buiten_ de subquery. Je doet namelijk een JOIN, en dit is beetje vreemd zoals hij nu is opgezet. En het feit dat de naam van de fiets in een andere tabel staat vind ik beetje raar, maar dat zal ik dan wel verkeerd interpreteren.
  1. SELECT DISTINCT f.fiets_id, g.fiets
  2. FROM fietsen f JOIN fiets g ON f.fiets_id = g.fiets_id
  3. HAVING (
  4. SELECT COUNT(*) FROM fietsen x WHERE x.onderdeel_id IN(1,2,5) AND x.fiets_id = f.fiets_id )
  5. >= 3
Bedankt door: prienstra
Offline prienstra - 11/02/2010 19:32
Avatar van prienstra MySQL interesse Werkt prima, en ook snel! Bedankt voor de reactie's.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.268s