Hoe kan je deze query maken ?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ronny Vangaster

Ronny Vangaster

27/11/2023 10:43:16
Quote Anchor link
Ik ben nog steeds bezig met het ontwikkelen van een planningsprogramma :

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

PHP hulp

05/11/2024 22:09:13
 
- Ariën  -
Beheerder

- Ariën -

27/11/2023 10:48:20
Quote Anchor link
En wat als je een zevende of achtste gids krijgt? Daarom moet je NOOIT bij meerdere aantallen horizontaal in de breedte werken.

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

Ivo P

27/11/2023 12:47:50
Quote Anchor link
en net als bij je afwezigheidstabel sla je ook hierbij dus niet de Naam van de gids op maar zijn id

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
 
Ronny Vangaster

Ronny Vangaster

27/11/2023 13:40:27
Quote Anchor link
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.
De toegevoegde gidsen staan wel degelijk verticaal vermeld in het toevoegblad.
 
- Ariën  -
Beheerder

- Ariën -

27/11/2023 13:42:12
Quote Anchor link
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 -
 
Jesper S

Jesper S

29/11/2023 15:53:50
Quote Anchor link
Ik heb de tabellen even gemaakt hoe ik ze zou maken
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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)
);


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)
PHP script in nieuw venster Selecteer het PHP script
1
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;


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
 
Ivo P

Ivo P

29/11/2023 17:12:15
Quote Anchor link
@Jesper:

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

Ronny Vangaster

04/12/2023 15:12:20
Quote Anchor link
Bedankt allemaal voor jullie op en aanmerkingen en werkende query's. Ik heb inderdaad dingen veranderd in het programma.
Niet meer in de breedte werken maar in de lengte, niet meer op naam selecteren maar op IDnummer. Werkt beter en sneller. Dank.
 



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.