SQL hoe query optimaliseren?

Gestart doorKitnkiller4 reacties238 weergaven

5 berichten · pagina 1 van 1

Kitnkiller

Lid · Topicstarter

Berichten
518
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Hallow, lang geleden hier smile
Ik heb onderstaande SQL query... Deze is met 2 subquerys maar ik ben 100% zeker dat ik deze query sneller kan maken door joins te gebruiken. Enkel weet ik niet exact hoe. Ik dacht een left outer join, maar hiermee kreeg ik steeds errors. Weet iemand hoe ik deze query kan optimaliseren en alsnog hetzelfde resultaat kan krijgen?

SELECT a.name, IFNULL((SELECT b.name FROM appointments_groups b WHERE groep = a.id AND b.appointment = .$event[id].),Er is nog geen activiteit ingegeven voor deze datum) AS activiteit, (SELECT b.special FROM appointments_groups b WHERE groep = a.id AND b.appointment = .$event[id].) AS special FROM groepen a WHERE a.id < 6 ORDER BY a.order


Alvast bedankt.
0
Rik

Lid

Berichten
18.393
Reputatie
0
Punten
0,04
Lid sinds
Laatst gezien
Wat weerhoudt je er van om dit te doen?

SQL:

SELECT 
    grp.name
    appgrp.name AS activiteit
    appgrp.special
FROM groepen grp
LEFT JOIN appointments_groups appgrp ON appgrp.group = grp.id
WHERE grp.id < 6
AND appgrp.appointment = ?
ORDER BY
    grp.order


PHP (>7.0):

$activity = $result[activiteit] ?? Er is nog geen activiteit ingegeven voor deze datum;


Mijn SQL is niet helemaal meer 100%, maar een LEFT JOIN zorgt er als het goed is voor dat de linker tabel (groups) altijd opgehaald zal worden, en de rechter tabel (appointments_groups) enkel opgehaald zal worden als deze bestaat op de join, anders worden de waardes die je daarvoor ophaalt NULL. Met de Null Coalescing Operator (??) in PHP 7 kijk je of de waarde isset is (en dus niet null is), zoja, dan gebruik je die waarde, anders gebruik je de andere opgegeven waarde ( in dit geval Er is nog geen activiteit ingegeven voor deze datum).
0
Berichten
20.364
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Rik schreef:
Wat weerhoudt je er van om dit te doen?

SQL:

SELECT 
    grp.name
    appgrp.name AS activiteit
    appgrp.special
FROM groepen grp
LEFT JOIN appointments_groups appgrp ON appgrp.group = grp.id
WHERE grp.id < 6
AND appgrp.appointment = ?
ORDER BY
    grp.order
PHP (>7.0):

$activity = $result[activiteit] ?? Er is nog geen activiteit ingegeven voor deze datum;


Mijn SQL is niet helemaal meer 100%, maar een LEFT JOIN zorgt er als het goed is voor dat de linker tabel (groups) altijd opgehaald zal worden, en de rechter tabel (appointments_groups) enkel opgehaald zal worden als deze bestaat op de join, anders worden de waardes die je daarvoor ophaalt NULL. Met de Null Coalescing Operator (??) in PHP 7 kijk je of de waarde isset is (en dus niet null is), zoja, dan gebruik je die waarde, anders gebruik je de andere opgegeven waarde ( in dit geval Er is nog geen activiteit ingegeven voor deze datum).

Dit dus. Joins gebruiken
0
Kitnkiller

Lid · Topicstarter

Berichten
518
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Rik schreef:
Wat weerhoudt je er van om dit te doen?

SQL:

SELECT 
    grp.name
    appgrp.name AS activiteit
    appgrp.special
FROM groepen grp
LEFT JOIN appointments_groups appgrp ON appgrp.group = grp.id
WHERE grp.id < 6
AND appgrp.appointment = ?
ORDER BY
    grp.order
PHP (>7.0):

$activity = $result[activiteit] ?? Er is nog geen activiteit ingegeven voor deze datum;


Mijn SQL is niet helemaal meer 100%, maar een LEFT JOIN zorgt er als het goed is voor dat de linker tabel (groups) altijd opgehaald zal worden, en de rechter tabel (appointments_groups) enkel opgehaald zal worden als deze bestaat op de join, anders worden de waardes die je daarvoor ophaalt NULL. Met de Null Coalescing Operator (??) in PHP 7 kijk je of de waarde isset is (en dus niet null is), zoja, dan gebruik je die waarde, anders gebruik je de andere opgegeven waarde ( in dit geval Er is nog geen activiteit ingegeven voor deze datum).

Ik heb jouw query verbeterd (kommas toegevoegd, en group was nederlands getypt). De query werkt, maar het probleem met deze query is dat als er geen rows in appointments_groups zijn dat er dan ook geen rij van de normale tabel wordt getoond.

SELECT
    grp.name,
    appgrp.name AS activiteit,
    appgrp.special
FROM
    groepen grp
LEFT JOIN
    appointments_groups appgrp
ON
    appgrp.groep = grp.id
WHERE
    grp.id < 6 AND appgrp.appointment = ?
ORDER BY
    grp.order


toevoeging op dinsdag 12 september 2017, 00:36:38:
Na nog wat te kutten heb ik het kunnen oplossen door de appgrp.appointment = ? bij in het ON-gedeelte te plaatsen

toevoeging op dinsdag 12 september 2017, 00:43:05:
Afbeelding
ziet er een stuk beter uit dan de oude query
Afbeelding
0
Rik

Lid

Berichten
18.393
Reputatie
0
Punten
0,04
Lid sinds
Laatst gezien
Ja, ik had het even snel onder pauze tijd in elkaar geflanst, niks uitgetest ofzo. Maar mooi dat het gelukt is smile
0

Jouw reactie

Deel je idee, stel een vraag of help een ander verder.

Editor laden…

Praat mee met de One2xs-community.

Inloggen om te reageren