login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Gevorderde query (Opgelost)

Offline Martijn - 31/01/2011 13:49 (laatste wijziging 31/01/2011 14:09)
Avatar van MartijnCrew PHP Beetje een puzzel en ik kom er niet uit. Ik heb de volgende url:

www.site.nl/producten/vrouwen-kinderen/ringen-armbanden/goud-zilver-glas

Al die dingen na '/producten/' zijn categorieën, elk heeft zn eigen id (bv glas=3).

Ik heb een array met al die id's ($classIds) uit de url, so far so good.
Vervolgens heb ik een producten tabel, met daarin o.a. id & naam.

Omdat een product meerdere categorieën kan bevatten (bv zilver en ring) is een tussentabel met item_id en category_id.

Zal even snel een paar regels geven om te database weer te geven:
  1. tabel categories
  2. ID NAAM
  3. 1 zilver
  4. 2 goud
  5. 3 glas
  6. 4 metaal
  7.  
  8. tabel category_item:
  9. ID item_id cat_id
  10. 1 4 2 (= goud)
  11. 2 4 3 (= glas)
  12. 3 5 4 (= metaal)

Stel, ik heb categorie ID's 2 en 3 (goud en glas). Dan wil ik de producten die goud EN zilver zijn. In mijn voorbeeld dus item_id = 4.
Iemand een idee hoe die query dan moet worden?

Martijn


edit:
Het betreft een redelijk grote database. Ik kan niet zomaar grote queries maken zonder meteen sloom te worden.

10 antwoorden

Gesponsorde links
Offline Abbas - 31/01/2011 14:00 (laatste wijziging 31/01/2011 14:01)
Avatar van Abbas Gouden medaille

Crew .NET
Zoiets in deze richting?

  1. SELECT item_id
  2. FROM category_item
  3. WHERE cat_id IN (SELECT id
  4. FROM categories
  5. WHERE naam = 'goud' OR naam = 'glas')
Offline Martijn - 31/01/2011 14:04
Avatar van Martijn Crew PHP nope, dan krijg je alles wat goud OF glas is ik wil goud EN glas, en je OR vervangen door AND wordt m helaas niet 
Offline Frisbee - 31/01/2011 14:05 (laatste wijziging 31/01/2011 14:06)
Avatar van Frisbee HTML beginner Als ik het goed begrijp zou je dan zoiets moeten krijgen:
  1. SELECT * FROM item INNER JOIN category_item ON (item.id = category_item.item_id) WHERE category_item.cat_id = 2 OR category_item.cat_id = 3
Offline Martijn - 31/01/2011 14:08
Avatar van Martijn Crew PHP nope. ook die zal dan alle goud en alle glas selecteren Sidenote (die ik ook ff mn topic in edit):

Het is een grote database t gaat door heel veel producten heen, en de tabel category_item is al helemaal niet bescheiden
Offline Frisbee - 31/01/2011 14:11 (laatste wijziging 31/01/2011 14:12)
Avatar van Frisbee HTML beginner Ohja, moest juist geen van die categorieën zijn. Zo dan dus:
  1. SELECT * FROM item INNER JOIN category_item ON (item.id = category_item.item_id) WHERE category_item.cat_id != 2 AND category_item.cat_id != 3 GROUP BY item.id
Offline Martijn - 31/01/2011 14:13
Avatar van Martijn Crew PHP ik denk dat je t ergens verkeerd gelezen hebt maar je hebt me wel op een idee gebracht die ik straks ga proberen (ben nu wat anders aan t doen)
Offline Frisbee - 31/01/2011 14:16
Avatar van Frisbee HTML beginner Oh, heb nog een keer goed gelezen, nu snap ik hem. Kan bijna op dezelfde manier als mijn eerste query maar dan met twee joins.

Zoiets:

  1. SELECT * FROM item INNER JOIN category_item AS t1 ON (item.id = t1.item_id AND t1.cat_id = 2) INNER JOIN category_item AS t2 ON (item.id = t2.item_id AND t2.cat_id = 3) GROUP BY item.id
Offline Martijn - 31/01/2011 14:19
Avatar van Martijn Crew PHP Maar een dubbele join is niet zo fijn in grotere selecties. En dr komt sowieso nog een join, want ik moet er meer mee doen dan alleen dit 
Offline Frisbee - 31/01/2011 15:03
Avatar van Frisbee HTML beginner Ben bang dat je daar niet aan ontkomt. Je wilt nou eenmaal op 3 tabellen selecteren dus dan zal je wel moeten joinen op meerdere tabellen.
Offline Martijn - 31/01/2011 15:57 (laatste wijziging 31/01/2011 15:58)
Avatar van Martijn Crew PHP Ik heb het al volgt opgelost:

Selecteer alle ID's waar category_id = [eerste ID uit array]
en dan vervolgens
Selecteer alle ID's waar category_id = [eerste ID uit array] AND item_id in([array van vorige query])
REPEAT 1 regel hierboven

Is nog best wel snel ook, sneller dan mn enkele query
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.207s