Hallo mede phphulp'ers,


Ik zit met een vervelend probleempje.
Ik heb een tabel met items, per item kan je verschillende categorieën hebben en nu vroeg ik me af of ik al die categorieën niet met een join kan ophalen en aan een key toekennen?

Vb: Ik heb een item X en bij item X horen categorieën O, P en Q en wil O, P en Q als een property van item X komen.
In de tabel items heb ik de velden title & description, nu wil ik dat O, P en Q in een extra key "cats" komen.
Op die manier zou ik dus alles zo kunnen uitlezen

Titel: $result['title'] (string)
Beschrijving: $result['description'] (string)
Categorieën: $result['cats'] (array)


Ik geraak niet verder dan ofwel 1 veld of een sql error, dit heb al:
SELECT
  portfolioItems.*,
  workFields.* AS workFields
FROM portfolioItems
LEFT OUTER JOIN portfolioLinkWorkfields ON portfolioLinkWorkfields.workfieldId = portfolioItems.id
LEFT OUTER JOIN portfolioWorkfields AS workFields ON workFields.id = portfolioLinkWorkfields.workfieldId
GROUP BY portfolioItems.id
ORDER BY createdDate DESC
LIMIT :start, :end





Dus, is er iemand die weet of dit mogelijk is? En zo ja, hoe?
Dit levert in elk geval een SQL error op:
workFields.* AS workFields

Je selecteert namelijk alle velden en geeft daar 1 alias aan, dat gaat niet werken. Uberhaupt is het natuurlijk beter om alle kolommen die je wilt selecteren uit te schrijven en geen * te gebruiken. Daarnaast heb je in zowel workFields als in portfolieItems zo te zien een kolom 'id', ook daar krijg je dus problemen mee. 1 van de 2 moet je in elk geval een alias geven om niet twee kolommen in je resultaat te krijgen met dezelfde naam.

Dan je probleem.... als ik je goed begrijp kan het wel, maar niet zoals jij het wil doen. In 1 statement kan je wel alle items en alle categorieen ophalen, maar besef dan dat je per categorie een rij krijgt. Met andere woorden als item X drie categorieen heeft, dan krijg je 3 rijen voor categorie X terug. In php zal je dat dan moeten gaan filteren.
Een andere manier is om twee statements te gebruiken. De eerste om alle items op te halen, de tweede om alle categorieen op te halen. Wederom in php kan je dan de datastructuur bouwen die je wilt.
Dat geeft inderdaad een error vandaar dat ik naar hier kwam :P.

Ok bedankt, ik denk dat het het makkelijkste gaat zijn om een aparte method te schrijven getCatsByPortfolioId ofzo, helaas dan maar een extra query.
Het is altijd een afweging. Je kan het in 1 query doen, maar dan haal je overbodig veel info op. Je kan het in 2 queries doen, maar dan doe je dus een query extra. Persoonlijk wil ik niet zeggen het een is beter dan het ander, het ligt aan de situatie. In beide gevallen is het niet optimaal en zal je erna nog iets in php moeten gaan klooien.
Het is inderdaad een afweging, maar in deze situatie is niet het verschil tussen 1 of 2 query's maar tussen 1 of bv 16. Als de db server niet lokaal staat kan dat zomaar een paar seconden verschil maken.
Als je het met 1 query doet moet je wel de LIMIT anders doen, die werkt namelijk op het totaal van de rijen. Bv:

SELECT p.inhoud, w.titel [,enderest]
FROM
	(SELECT inhoud [,enderest]
	FROM portfolio
	ORDER BY createddate
	LIMIT 5, 15) AS p
-- en dan hier je joins

Reageren