[MySQL] GROUP BY en ORDER BY..

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Scr33x0r
  • Registratie: September 2004
  • Laatst online: 17-09 09:01
Ik ga het even versimpeld uitleggen:

Ben bezig met takensysteem, daarbij hebben we 3 tables:

- trajecten: traject_id, website, startdate, timespent, hours
- taken: taak_id, name, sort
- traject_taken: tt_id, traject_id, task_id, prio, status

In de trajecten tabel zie je dus startdate, timespent en hourspermonth. Kortom:
Klant 1 (traject_id) met website www.google.nl (website) is gestart met een traject op 01-11-2010 (startdate), hij heeft 1 uur per maand (hours) en daarvan is nog niks gebruikt (timespent).

Taken bevat een aantal standaard (SEO)-taken die wij afronden in een bepaalde volgorde (sort).

Traject Taken is een tabel met daarin de combinatie en of een taak eventuele prioriteit heeft (1-5).

Ik wil een overzicht met daarin:
tt_id, sort, website, name, timespent, timetospent, percentage ongebruikte tijd, prio

Dan kom ik op de volgende query:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT 
    taken.tt_id
    taken.sort,
    trajecten.website,
    taken.sort,
    taken.timespent
    (FLOOR((UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(trajecten.startdate)) / 2629743) + 1) * trajecten.hours * 3600 AS timetospent,
    100 - (trajecten.timespent / ((FLOOR((UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(trajecten.start)) / 2629743) + 1) * trajecten.hours * 3600) * 100) AS percentage,
    traject_taken.prio
FROM
    taken,
    trajecten,
    traject_taken
WHERE
   trajecten.traject_id = traject_taak.traject_id
AND
   traject_taak.taak_id  = taken.taak_id
AND
    traject_taak.status = 1
ORDER BY
   traject_taken.prio,
   percentage,
   taken.sort


Het probleem is nu, dat ik van elk traject alle taken krijg, terwijl dat ik per traject de taak met de laagste sort wil.

Krijg ik dat voor elkaar met een INNER JOIN? Zoja hoe? Want een GROUP BY trajecten.traject_id werkt niet.

Dus wie is hier de SQL heer en meester? :D

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dat kan inderdaad gewoon met een join (waarschijnlijk een left outer join, niet een inner join ;) ). Ik durf gezien je vraagstelling met vrij grote zekerheid te zeggen dat je niet helemaal weet hoe een group by werkt. Zie daarvoor ook Programming FAQ - SQL: Hoe werkt dat GROUP BY nu eigenlijk?

Hoe zag de group by-query die niet werkte eruit?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Scr33x0r
  • Registratie: September 2004
  • Laatst online: 17-09 09:01
Een group by query:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT 
    taken.tt_id
    taken.sort,
    trajecten.website,
    taken.sort,
    taken.timespent
    (FLOOR((UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(trajecten.startdate)) / 2629743) + 1) * trajecten.hours * 3600 AS timetospent,
    100 - (trajecten.timespent / ((FLOOR((UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(trajecten.start)) / 2629743) + 1) * trajecten.hours * 3600) * 100) AS percentage,
    traject_taken.prio
FROM
    taken,
    trajecten,
    traject_taken
WHERE
   trajecten.traject_id = traject_taak.traject_id
AND
   traject_taak.taak_id  = taken.taak_id
GROUP BY
   trajecten.traject_id
ORDER BY
   traject_taken.prio,
   percentage,
   taken.sort


Heb je een voorbeeld van hoe ik die left join zou moeten doen?

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Vreemd dat je niet bij taken aan een deadline hebt gedacht. Ook jouw deadline kan een reden zijn om iets juist een hoge prioriteit te geven!

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik zou een voorbeeld kunnen geven maar ik kan ook nog eens wijzen naar de FAQ-link die ik hierboven ook al gaf. Ik zie dat je die niet doorgelezen hebt. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Scr33x0r
  • Registratie: September 2004
  • Laatst online: 17-09 09:01
NMe schreef op dinsdag 28 december 2010 @ 20:14:
Ik zou een voorbeeld kunnen geven maar ik kan ook nog eens wijzen naar de FAQ-link die ik hierboven ook al gaf. Ik zie dat je die niet doorgelezen hebt. ;)
Dus als ik de faq goed begrijp:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT 
    taken.tt_id
    MIN(taken.sort),
    trajecten.website,
    taken.sort,
    taken.timespent
    (FLOOR((UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(trajecten.startdate)) / 2629743) + 1) * trajecten.hours * 3600 AS timetospent,
    100 - (trajecten.timespent / ((FLOOR((UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(trajecten.start)) / 2629743) + 1) * trajecten.hours * 3600) * 100) AS percentage,
    traject_taken.prio
FROM
    taken,
    trajecten,
    traject_taken
WHERE
   trajecten.traject_id = traject_taak.traject_id
AND
   traject_taak.taak_id  = taken.taak_id
GROUP BY
    traject.traject_id
ORDER BY
   traject_taken.prio,
   percentage,
   taken.sort


Ik zal dit morgen op het wekr even testen, maar had al soortgelijk iets gedaan, maar dit moet ik dan combineren met een LEFT JOIN?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Scr33x0r schreef op dinsdag 28 december 2010 @ 20:20:
[...]


Dus als ik de faq goed begrijp:
Je begrijpt 't niet goed ;)
zodra je een GROUP BY-clause gebruikt, moeten alle geselecteerde kolommen terugkomen in de GROUP BY list ofwel een aggregate functie hebben.
Ik zie maar 1 veld in je GROUP BY en toch meer dan 1 (non-aggregated) veld in je SELECT ;)

Lees die hele FAQ eens aandachtig (en hell, voor mijn part met een kop koffie erbij) door:
MySQL is een hele brakke database, die deze laatste constructie wel toestaat. En volgens de handleiding is het 'by design' dat je vervolgens random waardes in kolom B aantreft. Don't do it.
Verder vind ik impliciete joins in een FROM/WHERE clause ook lelijk, maar da's persoonlijk: Hoe werken joins?

[ Voor 80% gewijzigd door RobIII op 28-12-2010 21:00 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

RobIII schreef op dinsdag 28 december 2010 @ 20:55:
[...]

Verder vind ik impliciete joins in een FROM/WHERE clause ook lelijk, maar da's persoonlijk: Hoe werken joins?
Da's niet alleen lelijk, het maakt ook een outer join onmogelijk.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
NMe schreef op dinsdag 28 december 2010 @ 22:12:
[...]

Da's niet alleen lelijk, het maakt ook een outer join onmogelijk.
Dat weet ik niet; ik gebruik altijd expliciete joins. Ik dacht dat zoiets wel kon:
SQL:
1
2
3
select X.*, Y.*
from X, Y
where X.id *= Y.id

( let op de *= of =* operator). Maar either way: implicit joins zijn bah :P

[ Voor 11% gewijzigd door RobIII op 28-12-2010 22:27 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • CyBeRSPiN
  • Registratie: Februari 2001
  • Laatst online: 12:32

CyBeRSPiN

sinds 2001

NMe schreef op dinsdag 28 december 2010 @ 22:12:
[...]

Da's niet alleen lelijk, het maakt ook een outer join onmogelijk.
Of het in MySQL kan weet ik niet, met een Oracle DB werkt het met "where a.id = (+)b.a_id", vind het zelf ook zeer verwarrend/lelijk, maar de outer join is "pas" in 1999 in de officiele ANSI SQL standaard vastgelegd. Tot die tijd had elk zichzelf respecterende DBMS een eigen syntax hiervoor.

Acties:
  • 0 Henk 'm!

  • DamadmOO
  • Registratie: Maart 2005
  • Laatst online: 19-09 19:31
RobIII schreef op dinsdag 28 december 2010 @ 22:23:
[...]

Dat weet ik niet; ik gebruik altijd expliciete joins. Ik dacht dat zoiets wel kon:
SQL:
1
2
3
select X.*, Y.*
from X, Y
where X.id *= Y.id

( let op de *= of =* operator). Maar either way: implicit joins zijn bah :P
Die join is inderdaad correct, maar gelukkig is die syntax deprecated sinds 2005 (in ieder geval in MSSQL 2005 compatibility mode).

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

RobIII schreef op dinsdag 28 december 2010 @ 22:23:
[...]

( let op de *= of =* operator). Maar either way: implicit joins zijn bah :P
MSSQL-only volgens mij. :P MySQL heeft voor zover ik weet geen impliciete outer join-mogelijkheden. :P Maar goed, laten we het ontopic houden. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Zou het niet veel handiger/sneller zijn je 'timespent' en je 'percentage' te denormaliseren? Van die 'magic numbers' in je query wordt t ook niet duidelijker.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Zolang het de query niet nodeloos vertraagt hoef je niet te denormaliseren. Als je de query zo onleesbaar vindt zou dat eerder een argument zijn om een stored procedure te gebruiken. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Toch jammer dat diverse mensen hier nu druk bezig zijn de topicstarter te wijzen op een fout gebruik van group by en verschillende manieren van joins schrijven... terwijl zijn probleem helemaal niet opgelost kan worden met een normale query met joins en group by.

GROUP BY werkt over kolommen, en verbreekt daardoor de relaties per regel die er normaal nog wel zijn. Daardoor kan je moeilijk garanderen dat je in elke regel per opgevraagde kolom daadwerkelijk de gegevens van de taak met de laagste nog beschikbare sort krijgt voor ieder traject. Dat kan eigenlijk alleen als je database daar een uitbreiding voor heeft in de SQL-variant (zoals PostgreSQL's DISCTINCT ON-feature), vziw heeft MySQL daar geen uitbreiding voor.

Hier is toch echt eoa subselect nodig om te kunnen joinen op specifieke taak die de laagste volgorde-nummer heeft. Zoiets:

SQL:
1
2
3
4
5
SELECT *
FROM trajecten tr
JOIN taken t ON t.tt_id = (SELECT ti.tt_id FROM taken ti 
                WHERE /* iets met de tijd */ and ti.traject_id = tr.id
                ORDER BY ti.sort LIMIT 1)


Uiteraard moet je daar dan ook nog je traject_taken-tabel in zien te verwerken en zijn er ook met dit soort wat complexere queries meerdere wegen naar Rome.
Ik weet ook niet helemaal zeker of MySQL ondertussen wel op die plek een subquery met order by en/of limit toelaat (de subquery mag er iig wel). Dat zou je dan eventueel weer met een sub-subquery in de WHERE-clause van de subquery kunnen oplossen die de MIN van alle nog beschikbare sort's opzoekt (where ti.sort = (select min(sort) from taken tii ...).

Ironisch genoeg heb je bij dit soort queries juist eigenlijk geen GROUP BY nodig ;)

[ Voor 18% gewijzigd door ACM op 29-12-2010 08:20 ]


Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
NMe schreef op woensdag 29 december 2010 @ 03:51:
Zolang het de query niet nodeloos vertraagt hoef je niet te denormaliseren. Als je de query zo onleesbaar vindt zou dat eerder een argument zijn om een stored procedure te gebruiken. :)
Ik mag aannemen aan dat je een VIEW bedoelt?

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
NMe schreef op woensdag 29 december 2010 @ 03:51:
Zolang het de query niet nodeloos vertraagt hoef je niet te denormaliseren. Als je de query zo onleesbaar vindt zou dat eerder een argument zijn om een stored procedure te gebruiken. :)
Dat zal wel smaak zijn dan, ik zou het onderhouds-technisch niet handig vinden om een hoop nikszeggende getallen in m'n queries te hebben staan.

Acties:
  • 0 Henk 'm!

  • Scr33x0r
  • Registratie: September 2004
  • Laatst online: 17-09 09:01
ACM schreef op woensdag 29 december 2010 @ 08:04:
Toch jammer dat diverse mensen hier nu druk bezig zijn de topicstarter te wijzen op een fout gebruik van group by en verschillende manieren van joins schrijven... terwijl zijn probleem helemaal niet opgelost kan worden met een normale query met joins en group by.
....
Hmm, ik kom er toch niet uit zo..

Het probleem is dat ik steeds meerdere keren 1 traject terug zie komen..

Ik heb dus de volgende tabellen:

Trajecten
traject_idwebsitestartdatetimespenthours
1www.google.nl2010-11-0123001
2www.yahoo.com2010-11-0114001
3www.bing.com2010-11-0117001


Taken
taak_idnamesort
1Backup maken1
2Google Analytics code plaatsen2
3Titels uniek maken3
4Zoekmachine vriendelijke URL's maken4
5Custom Taak, deze is toegevoegd voor 1 klant0


Traject_Taken
tt_idtraject_idtaak_idpriostatus
11139
21239
31331
41431
52139
62231
72331
82431
93551


Wat we dus hierboven zien is het volgende:

Traject 1 (www.google.nl) heeft als eerst volgende openstaande taak (status = 1) taak_id 3 (zie tt_id =3)
Traject 2 (www.yahoo.com) heeft als eerstvolgende openstaande taak (status = 1) taak_id 2 (zie tt_id = 6)
Traject 3 (www.bing.com) heeft als eerstvolgende openstaande taak een taak met prio 5, dus die moet eerst (zie tt_id 9)

Wat ik dus eigenlijk wil zien in mijn tabel is:
Top 10 openstaande taken
SortWebsiteNameTimespentTimetospentPercentagePrio
0www.bing.comCustom Taak, deze is toegevoegd voor 1 klant1700720076.39%5
2www.yahoo.comGoogle Analytics code plaatsen1400720080.56%3
3www.google.nlTitels uniek maken2300720068.06%3


Dus.. (tabellen maken kost best veel tijd :)) wie kan me helpen?

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het is trouwens timetospend

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Scr33x0r schreef op woensdag 29 december 2010 @ 11:24:
[...]


Hmm, ik kom er toch niet uit zo..

Het probleem is dat ik steeds meerdere keren 1 traject terug zie komen..

Ik heb dus de volgende tabellen:

Trajecten
traject_idwebsitestartdatetimespenthours
1www.google.nl2010-11-0123001
2www.yahoo.com2010-11-0114001
3www.bing.com2010-11-0117001


Taken
taak_idnamesort
1Backup maken1
2Google Analytics code plaatsen2
3Titels uniek maken3
4Zoekmachine vriendelijke URL's maken4
5Custom Taak, deze is toegevoegd voor 1 klant0


Traject_Taken
tt_idtraject_idtaak_idpriostatus
11139
21239
31331
41431
52139
62231
72331
82431
93551


Wat we dus hierboven zien is het volgende:

Traject 1 (www.google.nl) heeft als eerst volgende openstaande taak (status = 1) taak_id 3 (zie tt_id =3)
Traject 2 (www.yahoo.com) heeft als eerstvolgende openstaande taak (status = 1) taak_id 2 (zie tt_id = 6)
Traject 3 (www.bing.com) heeft als eerstvolgende openstaande taak een taak met prio 5, dus die moet eerst (zie tt_id 9)

Wat ik dus eigenlijk wil zien in mijn tabel is:
Top 10 openstaande taken
SortWebsiteNameTimespentTimetospentPercentagePrio
0www.bing.comCustom Taak, deze is toegevoegd voor 1 klant1700720076.39%5
2www.yahoo.comGoogle Analytics code plaatsen1400720080.56%3
3www.google.nlTitels uniek maken2300720068.06%3


Dus.. (tabellen maken kost best veel tijd :)) wie kan me helpen?
Misschien een stomme overbodige vraag, heb hem hier ook eerder gesteld, maar men ging alleen in op de group by, dat ik hem maar nog een keer plaats:

Hoe hou je rekening met je deadline, ook die is immers bepalend voor jouw prioriteit evenals de startdatum natuurlijk, maar daar vind ik niets van in jouw overzicht.

Acties:
  • 0 Henk 'm!

  • Scr33x0r
  • Registratie: September 2004
  • Laatst online: 17-09 09:01
We werken niet met deadlines, alleen wanneer iets opgepakt wordt telt.. Elke klant heeft x-aantal uren per maand en daar blijft het bij...

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

cariolive23 schreef op woensdag 29 december 2010 @ 08:24:
[...]

Ik mag aannemen aan dat je een VIEW bedoelt?
Nee? :)
Cartman! schreef op woensdag 29 december 2010 @ 11:15:
[...]

Dat zal wel smaak zijn dan, ik zou het onderhouds-technisch niet handig vinden om een hoop nikszeggende getallen in m'n queries te hebben staan.
Die zouden dan niet in je query staan maar in je SP. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
NMe schreef op woensdag 29 december 2010 @ 03:51:
Zolang het de query niet nodeloos vertraagt hoef je niet te denormaliseren. Als je de query zo onleesbaar vindt zou dat eerder een argument zijn om een stored procedure te gebruiken. :)
Zowel een view als een sp lossen het probleem van een complexe query niet op. Je stopt het alleen wat dieper weg. Dus ik zie niet in waarom een complexe query een reden zou zijn om het in een SP te doen. Je kunt de query ook gewoon op een andere plek neerzetten zodat het de rest van de code niet zoveel verstoord.
Scr33x0r schreef op woensdag 29 december 2010 @ 11:24:
[...]
Wat we dus hierboven zien is het volgende:

Traject 1 (www.google.nl) heeft als eerst volgende openstaande taak (status = 1) taak_id 3 (zie tt_id =3)
Traject 2 (www.yahoo.com) heeft als eerstvolgende openstaande taak (status = 1) taak_id 2 (zie tt_id = 6)
Traject 3 (www.bing.com) heeft als eerstvolgende openstaande taak een taak met prio 5, dus die moet eerst (zie tt_id 9)

Wat ik dus eigenlijk wil zien in mijn tabel is:
Top 10 openstaande taken
SortWebsiteNameTimespentTimetospentPercentagePrio
0www.bing.comCustom Taak, deze is toegevoegd voor 1 klant1700720076.39%5
2www.yahoo.comGoogle Analytics code plaatsen1400720080.56%3
3www.google.nlTitels uniek maken2300720068.06%3


Dus.. (tabellen maken kost best veel tijd :)) wie kan me helpen?
Volgens mij ben je op zoek naar een groupwise maximum / minimum

[ Voor 18% gewijzigd door Woy op 29-12-2010 13:21 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Scr33x0r
  • Registratie: September 2004
  • Laatst online: 17-09 09:01
Hmm, nog even testen, maar volgens mij heb ik het:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
SELECT 
    taken.sort,
    taken.name,
    trajecten.website,
    trajecten.timespent,
    (FLOOR((UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(trajecten.startdate)) / 2629743) + 1) * trajecten.hours * 3600 AS timetospent,
    100 - (trajecten.timespent / ((FLOOR((UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(trajecten.startdate)) / 2629743) + 1) * trajecten.hours * 3600) * 100) AS percentage,
    traject_taken.status,
    traject_taken.tt_id,
    traject_taken.prio
FROM
    trajecten,
    traject_taken
JOIN
    taken
ON
    taken.taak_id = 
    (
        SELECT
            t.taak_id
        FROM
            taken t,
            traject_taken tt
        WHERE
            tt.taak_id  = t.taak_id
        AND
            tt.traject_id = trajecten.traject_id
        AND
            tt.status = 0
        ORDER BY
            tt.prio DESC,
            t.sort
        LIMIT
            1
    )
WHERE
   trajecten.traject_id = traject_taken.traject_id
AND
   traject_taken.taak_id  = taken.taak_id
AND
    traject_taken.status = 0
ORDER BY
   traject_taken.prio DESC,
   percentage DESC,
   taken.sort

[ Voor 1% gewijzigd door Scr33x0r op 29-12-2010 13:43 . Reden: Even nog een sort toevoegen voor prio in JOIN where clause.. ]


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Scr33x0r schreef op woensdag 29 december 2010 @ 13:39:
Hmm, nog even testen, maar volgens mij heb ik het:
SQL:
1
2
3
4
5
6
7
-- ...
FROM
    trajecten,
    traject_taken
JOIN
    taken
-- ...
Het ziet er in ieder geval ongeveer uit zoals ik bedoelde, wellicht is het nog wel handig voor jezelf om bovenstaande im- en expliciete inner joins allemaal expliciet te maken (dus trajecten join traject_taken ... and ... and ... join taken ...). Dat houdt de query doorgaans net wat leesbaarder :)

Acties:
  • 0 Henk 'm!

  • Scr33x0r
  • Registratie: September 2004
  • Laatst online: 17-09 09:01
ACM schreef op woensdag 29 december 2010 @ 14:54:
[...]

Het ziet er in ieder geval ongeveer uit zoals ik bedoelde, wellicht is het nog wel handig voor jezelf om bovenstaande im- en expliciete inner joins allemaal expliciet te maken (dus trajecten join traject_taken ... and ... and ... join taken ...). Dat houdt de query doorgaans net wat leesbaarder :)
Dat snap ik niet :)

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je selecteerd nu uit 2 tabellen in de FROM clause, en joint die nu in je WHERE clause. Het is duidelijker als je daar gewoon een JOIN clause voor gebruikt.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Woy schreef op woensdag 29 december 2010 @ 13:18:
[...]

Zowel een view als een sp lossen het probleem van een complexe query niet op. Je stopt het alleen wat dieper weg. Dus ik zie niet in waarom een complexe query een reden zou zijn om het in een SP te doen. Je kunt de query ook gewoon op een andere plek neerzetten zodat het de rest van de code niet zoveel verstoord.
Het ging er niet om om de query minder complex te maken maar om de magic numbers eruit te halen en op een centrale plaats te hebben. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
NMe schreef op woensdag 29 december 2010 @ 15:16:
[...]

Het ging er niet om om de query minder complex te maken maar om de magic numbers eruit te halen en op een centrale plaats te hebben. :)
Maar ook daarvoor hoef je geen view of sp te maken, dus ik snap je punt niet helemaal.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
NMe schreef op woensdag 29 december 2010 @ 13:16:
[...]
Die zouden dan niet in je query staan maar in je SP. :)
Dat snap ik maar dan heb je dus ergens los van je code nog meer code waarbij (meestal!) geen duidelijk documentatie zit wat die getallen zijn en wat ze doen. Als je dat tijdens het inserten meteen uitrekent dan heb je de duratie allang afgevangen, lijkt me veel simpeler en sneller. Je percentage wordt ook ineens simpeler. Snap je m'n punt?
Pagina: 1