Ga naar inhoud
Log in om dit te volgen  
kitnkiller

SQL hoe query optimaliseren?

Aanbevolen berichten

Hallow, lang geleden hier smiley

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?
Codeblok:
1
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.

Deel dit bericht


Link naar bericht
Delen op andere sites
Wat weerhoudt je er van om dit te doen?

SQL:
Codeblok:
1
2
3
4
5
6
7
8
9
10
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):

Codeblok:
1
$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).

Deel dit bericht


Link naar bericht
Delen op andere sites
Rik (link):
Wat weerhoudt je er van om dit te doen?

SQL:
Codeblok:
1
2
3
4
5
6
7
8
9
10
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):

Codeblok:
1
$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

Deel dit bericht


Link naar bericht
Delen op andere sites
Rik (link):
Wat weerhoudt je er van om dit te doen?

SQL:
Codeblok:
1
2
3
4
5
6
7
8
9
10
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):

Codeblok:
1
$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.

Codeblok:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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:
Plaatje
ziet er een stuk beter uit dan de oude query
Plaatje

Deel dit bericht


Link naar bericht
Delen op andere sites
Ja, ik had het even snel onder pauze tijd in elkaar geflanst, niks uitgetest ofzo. Maar mooi dat het gelukt is smiley

Deel dit bericht


Link naar bericht
Delen op andere sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reageer op dit topic...

×   Geplakt als RTF formaat tekst.   Plak in plaats daarvan als platte tekst

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

Log in om dit te volgen  

×
×
  • Nieuwe aanmaken...