[SQL] Ophalen met prioriteit

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Wouter J

Wouter J

13/07/2013 19:00:46
Quote Anchor link
Oké, ik ga een CMS maken. De basis is dat je heel veel kleine blokjes hebt op je pagina. De tekst voor zo'n blokje staat opgeslagen in je database.

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
 
PHP hulp

PHP hulp

16/04/2024 08:26:20
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

13/07/2013 20:33:38
Quote Anchor link
Ik zit nu via mijn telefoon, maar ik zal morgen even hierop reageren.
Tenzij Erwin me voor is ;-)
 
Erwin H

Erwin H

13/07/2013 23:41:08
Quote Anchor link
Gaat niet gebeuren denk ik. Kom net van een feestje, dus ook voor mij wordt het morgen :-)

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...

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...
 
Wouter J

Wouter J

14/07/2013 17:41:10
Quote Anchor link
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?
 
Erwin H

Erwin H

14/07/2013 17:53:07
Quote Anchor link
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.
 
TJVB tvb

TJVB tvb

14/07/2013 18:12:30
Quote Anchor link
Je kunt ook gebruik maken van een if in je query. Dan kun je dus kiezen uit je waardes
IF(waardesbestaat,waardea,defaultwaarde)
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

14/07/2013 18:27:51
Quote Anchor link
Ik heb hetzelfde principe toegepast met taalafhankelijke toepassingen, in een tabel staan de items en in de andere tabel de taalafhankelijke inhoud, die tabel kan de 2x joinen, en dan met COALESCE bepalen welk veld geselecteerd moet worden
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
SELECT
    COALESCE(u.lang_content, d.lang_content, 'unknown') AS content
FROM
    language_items i
LEFT JOIN
    language_content AS u
    ON i.item_id = u.item_id AND u.lang_id = 'nl'
LEFT JOIN
    language_content AS d
    ON i.item_id = d.item_id AND d.lang_id = 'en'
 
Wouter J

Wouter J

15/07/2013 00:02:40
Quote Anchor link
COALESCE ziet eruit naar de oplossing. De tabellen structuur gaat er echter nog wel wat moeilijker uitzien dan dit... Ik ga wel stoeien na mijn vakantie, voor de mensen die dit dus ook willen: COALESCE

Erwin, ook jij bedankt voor je hulp. Ik zal eens wat gaan lezen over union
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.