Ingewikkelde querys
Ik ben bezig met een database met foto's functioneel te maken. Elke foto behoort tot een of meerdere mediums. Zijn er meerdere mediums, worden deze met comma's geschijden. Maar omdat ik een groep foto's op medium selecteer, ziet hij het niet als twee aparte mediums, maar als een hele. Wat uitleg:
Zo staat het ongeveer in de database:
ID IMAGE MEDIUM
1 img01 beeld
2 img02 object
3 img03 object, lettertype
1) Alle items (in dit geval mediums als beeld, object etc) worden weergeven.
SELECT DISTINCT * FROM `sheet1`
2) Gast kiest medium. Bijvoorbeeld `beeld`
<a href="/medium/Beeld/">beeld</a>
3) Alle items waarvan het medium `beeld` is worden weergeven
SELECT * FROM `sheet1` WHERE `medium` = 'beeld'
4) In de database is maar een MEDIUM `beeld`, dus is er maar één foto. Gast klikt op 1.
<a href="/medium/Beeld/1/">1</a>
5) Image wordt weergeven: beeld >> 1, dus wordt het img01
SELECT * FROM `sheet1` WHERE `medium` = 'beeld' AND `id` = '1'
Maar nu moeten er soms meerdere mediums in één veld komen, geschijden met een comma.
Bijvoorbeeld de foto `img03` behoort tot object, en tot lettertype. Dus bij deze query:
SELECT * FROM `sheet1` WHERE `medium` = 'oject'
moet een hyperlink naar `img02` en `img03` worden weergeven.
Zelf dacht ik om in een while alle zonder comma in een array te stoppen, en met comma eerst te splitsen, en dan pas in het array te stoppen. Vervolgens array_unique() toe te passen. Dan de array uitlezen en de resultaten weergeven. Maar is er niet een betere oplossing hiervoor?
Het gaat om deze >> http://annakrylova.nl/medium/
Ik kom er alleen even niet uit.
Groet Koen
Quote:
Zijn er meerdere mediums, worden deze met comma's geschijden.
Daar gaan we...
Een database is er voor om gegevens gescheiden op te slaan.
Je zal die structuur dus moeten aanpassen naar iets als:
tabel image:
- id
- image
tabel medium:
- id
- medium
tabel imagemedium:
- image_id
- medium_id
En vervolgens kan je met joins gaan selecteren.
Gewijzigd op 01/01/1970 01:00:00 door Bo az
Wat ik kan doen is de boel apart opslaan, maar bij het aanpassen de boel samen voegen.
Hier kan men de boel aanpassen:
http://annakrylova.nl/weergeven/ ( voor aanpassen moet je ingelogd zijn)
Zelf heb ik het namelijk ook liever apart, alleen voor het beheer is het scheiden met comma's makkelijker.
vlerknozem schreef op 18.12.2007 16:13:
Komma's zijn niet makkelijker, de boel komma-gescheiden opslaan maakt de boel zeker een factor 1000 moeilijker. Dhr. Codd mag je beschouwen als een genie en hij heeft uitgevonden dat komma-gescheiden opslaan een slecht plan is. Totdat je het tegendeel kunt bewijzen, geloof ik hem op zijn woord.oke, ik snap waar je op doelt. Maar de rede ervan dat de boel met comma's wordt gescheiden, is dat men niet twee keer dezelfde image hoeft in te voeren.
Wat ik kan doen is de boel apart opslaan, maar bij het aanpassen de boel samen voegen.
Hier kan men de boel aanpassen:
http://annakrylova.nl/weergeven/ ( voor aanpassen moet je ingelogd zijn)
Zelf heb ik het namelijk ook liever apart, alleen voor het beheer is het scheiden met comma's makkelijker.
Wat ik kan doen is de boel apart opslaan, maar bij het aanpassen de boel samen voegen.
Hier kan men de boel aanpassen:
http://annakrylova.nl/weergeven/ ( voor aanpassen moet je ingelogd zijn)
Zelf heb ik het namelijk ook liever apart, alleen voor het beheer is het scheiden met comma's makkelijker.
Kortom, ga normaliseren en een goede database aanmaken.
Ook in de opzet die ik je ga hoef je een image niet 2x op te geven, je image heeft daarna een id en die mag je aan zoveel verschillende media hangen als je zelf wil.
En voor de administratie, ik neem aan dat je een dropdown hebt, waaruit je kan kiezen of iets een beeld, object, lettertype is. Met een simpel scriptje kan je met 1 druk op de knop nog een selectbox toevoegen, waaruit je dan bijvoorbeeld het 2e medium hebt.
Nog mooier is de "multiple selectbox" waaruit je met een ctrl+click meerdere willekeurige items kan selecteren.
Als ik jou was zou ik daar eens naar gaan kijken. Dat werkt net zo gemakkelijk als wat jij zegt, maar ik veel controleerbaarder en werkt uiteindelijk ook nog eens eenvoudiger.
Door het goed normaliseren van je database zal je merken dat het uiteindelijk allemaal veel eenvoudiger werkt. En groot voordeel: De kans op fouten in je database is kleiner geworden.
Edit:
En bij zo'n multiple select kan je prima met je genormaliseerde database werken (zoals Boaz je al een goed voorzet gaf!), eigenlijk zitten er vooral voordelen aan, behalve dat je even wat ingewikkelder moet denken misschien (voor je gevoel)
En bij zo'n multiple select kan je prima met je genormaliseerde database werken (zoals Boaz je al een goed voorzet gaf!), eigenlijk zitten er vooral voordelen aan, behalve dat je even wat ingewikkelder moet denken misschien (voor je gevoel)
Gewijzigd op 01/01/1970 01:00:00 door Robert Deiman
Ik werk niet met een selectbox, kan ik eventueel wel doen.
Idee:
Bij de administratie zet de gebruiker:
- MEDIUM `beeld,lettertype`
- IMAGE `img01.jpg`
Nu zoek ik het id van de IMAGE op, dat is bijvoorbeeld 44. Ik split het MEDIUM, en neem de juiste ids. `beeld` krijgt 32 en `lettertype` krijgt `11`.
Dan twee inserts met deze data:
tabel imagemedium:
- image_id = 44
- medium_id = 32
tabel imagemedium:
- image_id = 44
- medium_id = 11
Daarmee selecteer ik de bijbehorende image. Uiteraard moet ik hiervoor een JOIN gebruiken. Selecteer ik een medium selecteer ik het op medium_id. Dus de url /medium/beeld/ wordt dan ook /medium/32/. Voor de administratie selecteer ik voor `medium` weer op image_id, en zet de verschillende mediums weer samen met comma's.
Ik denk dat ik het zo goed begrepen heb.
Ik heb wijnig ervaring met JOIN. Misschien kunnen jullie me daarbij op weg helpen? Ik ben jullie zeer dankbaar :)
Klik
Maar hoezo weer samen zetten met comma's? Dat is nooit nodig..
Gewijzigd op 01/01/1970 01:00:00 door Robert Deiman
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$get['resource'] = mysql_query("SELECT
c.image_id, c.medium_id, c.infodata_id,
m.id, m.medium,
i.id, i.image,
d.id, d.titel, d.discipline, d.datum, d.materiaal, d.maatmm, d.oplage, d.opdrachtgever, d.favorite, d.kleur, d.groep, d.publicatie
FROM
connections AS c
LEFT JOIN
image as i
ON
i.id = c.image_id
INNER JOIN
infodata as d
ON
d.id = c.infodata_id
RIGHT JOIN
medium as m
ON
m.id = c.medium_id
LIMIT
". $start .", ".$entries) or die ( mysql_error());
?>
$get['resource'] = mysql_query("SELECT
c.image_id, c.medium_id, c.infodata_id,
m.id, m.medium,
i.id, i.image,
d.id, d.titel, d.discipline, d.datum, d.materiaal, d.maatmm, d.oplage, d.opdrachtgever, d.favorite, d.kleur, d.groep, d.publicatie
FROM
connections AS c
LEFT JOIN
image as i
ON
i.id = c.image_id
INNER JOIN
infodata as d
ON
d.id = c.infodata_id
RIGHT JOIN
medium as m
ON
m.id = c.medium_id
LIMIT
". $start .", ".$entries) or die ( mysql_error());
?>
Geef me als het niet echt slim is, maar een tik op de vinger hoor :) Maar het werkt in ieder geval we
Edit
Nee hij doet het toch verkeerd!
Situatie:
- Tabel connections is leeg
- Tabel image is leeg
- Tabel mediun is gevuld
- Tabel infodata is leeg.
De query moet kijken naar wat in connections staat. Uit de andere tabellen mag dus enkel de data worden gehaald die overeen komen met de connecties. Als deze tabel connecties dus leeg is, zouden er toch geen mediums mogen verschijnen? Toch worden alle mediums uit de tabel medium gehaald.
Gewijzigd op 01/01/1970 01:00:00 door Koen Bokern
Echter nu het volgende:
In de vorige database stond bij `medium` bijvoorbeeld 'object, drukken'.
Nu heb ik in plaats van scheiden met comma's, twee connecties gemaakt:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
+-----------+-----------+-------------+
| image_id | medium_id | infodata_id |
+-----------+-------------+-----------+
| 48 | 4 | 48 |
+-----------+-----------+-------------+
| 48 | 5 | 48 |
+-----------+-----------+-------------+
| image_id | medium_id | infodata_id |
+-----------+-------------+-----------+
| 48 | 4 | 48 |
+-----------+-----------+-------------+
| 48 | 5 | 48 |
+-----------+-----------+-------------+
Dit werkt. Alleen omdat er twee connecties zijn, zal zit bij de adminpagina ook zo zijn, terwijl ik eigenlijk maar één keer dezelfde image wil weergeven, met de bijbehorende data. Nu komt het er dus op neer dat je één image ook vaker in de database moet zettten, wat ik dus wil voorkomen.
Ik zou natuurlijk bij de while lus een geschiedenis kunnen bijhouden door de mediums die zijn geweest in een array te zetten. En iedere keer controleren of hij niet toevallig is geweest. Als hij al is geweest de key ervan opzoeken, en de twee medium erbij plakken. Vervolgens die array uitlezen en de data weergeven, maar ik denk zelf dat dit gekkenwerk is.
Is er misschien een betere (mogelijke) oplossing dan wat ik hierboven vertel?
Alvast bedankt :)
Edit:
Overigens sorry voor de bump bedenk ik me net. Maar anders werd het ook erg veel voor een bericht.
Gewijzigd op 01/01/1970 01:00:00 door Koen Bokern
Als echter ook de verschillende mediums nodig hebt, zul je inderdaad zoals je zelf al zegt een geschiedenis in de while loop bij moeten houden.
Gewijzigd op 01/01/1970 01:00:00 door Koen Bokern
Quote:
Zodra jij op 'plaats bericht' drukt wordt je postaantal in de database geupdate. Maar voor de pagina die getoond wordt, wordt nog wel de oude waarde uitgelezen.Nu ik dit schrijf heb ik 59 posts. Maar als ik op 'Plaats bericht' klik, heb ik nog steeds 59 posts. Hoe wordt dat aantal eigenlijk berekend?
Pas zodra de pagina weer refreshed, is je postaantal geupdate. Nu sta je immers op 60...
Maar weer ontopic nu.
Nu wordt het goed aangepast. Nu alleen nog even enkele tabellen legen, en de data nog een keer juist overzetten. Dan ben ik alweer een heel stuk verder.
Bedankt mensen.