[SQL] Ophalen met prioriteit
Nu heb je blokken waarbij de content altijd veranderd (bijv. de content block), maar je hebt ook blokken waarbij de content nooit veranderd (bijv. de contact information block). Ook heb je blokken die altijd hetzelfde zijn behalve bij 1 pagina.
Nu zat ik zelf te denken aan deze tabellen structuur:
route
id
path
template (bevat de blokken)
block_content
route_id (references route.id)
block_id (id van de block in de template)
content_id (references content.id)
content
id
content
Hoe ga ik hierin dan zorgen dat blokken dezelfde tekst (dus content.id) heeft op elke pagina? Ik dacht door een speciale id (bijv. _all) te gebruiken voor block_content.route_id
Nu moet je dus een query gaan opbouwen die eerst probeert de content van de block op te vragen voor de huidige route en als dat niet lukt de content voor het block voor route_id = '_all'.
Daar kom ik niet uit...
Als iemand trouwens een betere manier weet om dit te regelen hoor ik dat graag!
Gewijzigd op 13/07/2013 19:01:12 door Wouter J
Tenzij Erwin me voor is ;-)
Toevoeging op 14/07/2013 17:28:32:
Omdat Ger zo traag is vandaag, is hij alsnog te laat :-)
Wouter J op 13/07/2013 19:00:46:
Nu moet je dus een query gaan opbouwen die eerst probeert de content van de block op te vragen voor de huidige route en als dat niet lukt de content voor het block voor route_id = '_all'.
Daar kom ik niet uit...
Daar kom ik niet uit...
Ik weet niet of ik je hele verhaal precies begrijp, maar op deze vraag kan ik denk ik alsnog wel een antwoord geven.
Een soortgelijke situatie heb ik namelijk niet al te lang geleden gehad met een instellingen tabel. Daar ging het erom dat elke gebruiker bepaalde instellingen kan verandere voor verschillende zaken op de site. Het was echter niet verplicht en nieuwe users hebben ook nog niets opgegeven. In die gevallen heb ik dus een default nodig. De oplossing was om voor elke mogelijke instelling een default record aan te maken. Bij het ophalen selecteer je dan op user, of op default, je sorteert zodanig dat de user boven aan komt en selecteert maar 1 record. Bestaat dan het user record, dan lees je die uit (en negeer je het default record), bestaat er geen user record dan lees je het default record uit.
In jouw geval kan je dit dus ook gebruiken. Selecteer zowel het blok voor de route en het default blok, zorg dat je zodanig kan sorteren dat het route blok boven komt en lees alleen het eerste record uit.
Als ik je vraag dus helemaal goed begrepen heb...
Erwin, bedankt voor je reactie. Dat is inderdaad wel een oplossing, alleen betekend dat dat ik dus zo'n 5 queries moet runnen voor het ophalen van de content. Kan dat niet in 1 query?
Kan vast ook in 1. In het ergste geval kan je altijd nog gebruik maken van een union. Wat volgens mij hier nog niet eens een 'slechte' oplossing is, aangezien je met behulp van indices op je tabellen vrij eenvoudig de juiste records kunt bereiken.
IF(waardesbestaat,waardea,defaultwaarde)
Erwin, ook jij bedankt voor je hulp. Ik zal eens wat gaan lezen over union