Hoe kan je deze query maken ?
Ik kan in dit programma een "rondleiding" toevoegen, en een gids(en) selecteren die de rondleiding kunnen doen. Zo kunnen maximaal 6 gidsen worden toegevoegd aan één rondleiding.
De tabel rondleidingen bestaat uit o.a. deze velden:
datum (date veld)
beginuur (time veld)
einduur (time veld)
klantnaam (varchar 100)
gids1 (varchar 100)
gids2 (varchar 100)
gids3 (varchar 100)
gids4 (varchar 100)
gids5 (varchar 100)
gids6 (varchar 100)
ik heb ook een tabel ( dank voor jullie hulp uit de vorige post ) van de gidsen die kunnen aanwezig zijn op de datum van de rondleiding met o.a. dit veld :
naam (varchar 100)
Ik wil nu een query maken die een lijst vertoond met daarin de namen van de gidsen en de datum van de rondleiding. Met welke code kan ik een query maken ? Lijkt simpel, maar de query moet zo zijn dat in de lijst de namen worden getoond die kunnen voorkomen in de zes velden van de tabel rondleidingen. Dank bij voorbaat.
Gewijzigd op 27/11/2023 10:46:40 door Ronny Vangaster
Gebruik een aparte tabel met de naam gidsen, en zet je gidsen daarin. In een tabel rondleidingen_gidsen koppel je vervolgens welke GidsID bij welke Rondleiding ID hoort. Op die manier kan je jouw database oneindig verticaal uitbreiden in de lengte.
Waarbij gids_id een voor de hand liggende naam van die kolom is en niet gebruikers_id.
zo ook voor de klant met een klant_id
Voor de datum en tijd: vaak is het veel handiger om beide samen in een datetime kolom te stoppen.
,
Toevoeging op 27/11/2023 12:48:57:
verded eens met Ariën dat genummerde kolommen een sterke hint zijn voor een fout datamodel
Toevoeging op 27/11/2023 12:56:18:
welke entiteiten heb je?
- klanten
- gidsen
- reserveringen
- afwezigheid van gidsen
deze verdienen dus allemaal een tabel.
als er een relatie tussen tabellen ligt kun je middels foreign Keys verwijzen.
een klant_id in reservering maakt dat je weet van welke klant deze reservering is.
Mogelijk heeft de klant volgende week nog een reservering.
meerdere gidsen kan ook
dan maak je een koppeltabel met 2 kolommen
- gids_id
- reservering_id
en daar kun je dan 1, 2 of 25 gidsen i kwijt per reservering
De toegevoegde gidsen staan wel degelijk verticaal vermeld in het toevoegblad.
Ronny Vangaster op 27/11/2023 13:40:27:
het ID nummer zit er wel degelijk in maar is deze post niet vermeld. Maximaal zes gidsen kunnen een rondleiding gezien de structurele beperkingen die aanwezig zijn, maar in het algemeen doen 3 of 4 gidsen een rondleiding op hetzelfde uur en datum. Precies daarom is het niet nodig om dit verder aan te passen.
Dit is juist iets wat je moet aanpassen. Je maak op deze manier echt onlogische lange queries. En joinen wordt met een verticale structuur veel eenvoudiger. Dus weg met die genummerde velden en gebruik een koppeltabel met ID's. Met een simpele COUNT() kan je zo in een oogopslag zien hoeveel gidsen er bijvoorbeeld zijn voor de rondleiding van 10:00 uur.
Zo zou je bij eventuele drukte zelfs met simpele queries vooruit kunnen zien wanneer er te weinig gidsen zijn. Aan de hand van het aantal ingetekende mensen, en kan je dan zien wanneer je op welk moment extra gidsen moet inroosteren voor hun dienst.
Quote:
De toegevoegde gidsen staan wel degelijk verticaal vermeld in het toevoegblad.
De gebruikersinterface is niet van belang voor je vraag. Het gaat om de opslag die nu horizontaal is, voor wat de gidsen betreft. Die moet je verticaal maken. Dus een nieuw record voor elke GidsID die je koppelt aan een RondleidingID.
Gewijzigd op 27/11/2023 13:49:53 door - Ariën -
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE TABLE rondleidingen (
id INT AUTO_INCREMENT PRIMARY KEY,
begin_datetime DATETIME NOT NULL,
eind_datetime DATETIME NOT NULL,
klantnaam VARCHAR(255) NOT NULL
);
CREATE TABLE gidsen (
id INT AUTO_INCREMENT PRIMARY KEY,
naam VARCHAR(255) NOT NULL
);
CREATE TABLE rondleiding_gidsen (
rondleiding_id INT,
gids_id INT,
FOREIGN KEY (rondleiding_id) REFERENCES rondleidingen(id),
FOREIGN KEY (gids_id) REFERENCES gidsen(id),
PRIMARY KEY (rondleiding_id, gids_id)
);
id INT AUTO_INCREMENT PRIMARY KEY,
begin_datetime DATETIME NOT NULL,
eind_datetime DATETIME NOT NULL,
klantnaam VARCHAR(255) NOT NULL
);
CREATE TABLE gidsen (
id INT AUTO_INCREMENT PRIMARY KEY,
naam VARCHAR(255) NOT NULL
);
CREATE TABLE rondleiding_gidsen (
rondleiding_id INT,
gids_id INT,
FOREIGN KEY (rondleiding_id) REFERENCES rondleidingen(id),
FOREIGN KEY (gids_id) REFERENCES gidsen(id),
PRIMARY KEY (rondleiding_id, gids_id)
);
Mocht er ooit 1 grote rondleiding zijn waar je 10 gidsen aan wilt koppelen, hoe wil je dat gaan doen?
Maak daarom gebruik van een koppel tabel.
Om dan een overzicht te krijgen welke gidsen aanwezig zijn bij welke rondleiding kun je opvragen dmv deze query:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
SELECT r.begin_datetime AS Datum_Begin,
r.eind_datetime AS Datum_Eind,
r.klantnaam AS Klantnaam,
Group_concat(g.naam ORDER BY g.naam ASC) AS Gidsen
FROM rondleidingen r
INNER JOIN rondleiding_gidsen rg
ON r.id = rg.rondleiding_id
INNER JOIN gidsen g
ON rg.gids_id = g.id
GROUP BY r.id
ORDER BY r.begin_datetime;
r.eind_datetime AS Datum_Eind,
r.klantnaam AS Klantnaam,
Group_concat(g.naam ORDER BY g.naam ASC) AS Gidsen
FROM rondleidingen r
INNER JOIN rondleiding_gidsen rg
ON r.id = rg.rondleiding_id
INNER JOIN gidsen g
ON rg.gids_id = g.id
GROUP BY r.id
ORDER BY r.begin_datetime;
Hopelijk kun je hier mee verder! Heb je vragen, dan hoor ik dat graag.
Edit: Query voor ophalen rondleidingen even door een 'beautifier' gehaald.
Gewijzigd op 30/11/2023 09:50:29 door Jesper S
Je SELECT-query wordt een stuk leesbaarder als je op tactische plekken op <enter> zou drukken.
En je kunt overwegen om de klanten ook een eigen tabel te geven, waarmee je dan in de tabel Rondleidingen een klant_id zou plaatsen.
Hangt mede af van de vraag of je meer wilt met de klanten. Bijvoorbeeld een telefoonnummer noteren, een e-mail voor de bevestiging / review sturen etc.
Dat zijn ook zaken waar je je Rondleidingen tabel niet mee wilt vervuilen EN je wilt ze voor 1 klant (zeg school) 6x noteren omdat ze met 6 klassen een keertje komen.
Niet meer in de breedte werken maar in de lengte, niet meer op naam selecteren maar op IDnummer. Werkt beter en sneller. Dank.