Zoals de meesten die dit lezen wellicht weten kun je met de geagregeerde function MIN() een minimale waarde uit een set selecteren. Nu wil ik echter het bijbehorende record ID waar deze minimale waarde komt OOK hebben, en dit schijnt MySQL dus niet automatisch mee te nemen. Wat ook vermeldt staat trouwens:
Stel de query:
Deze geeft als resultaat:
De name en minimal kolom zijn logisch. Alleen ik wil dus dat hij het bijbehorende record wordt meegeselecteerd. In dit voorbeeld dus:
Aangezien record #4 uit test1 die minimale waarde heeft. Op geen enkele manier "tagged" MIN() het record waaruit hij de minimale waarde uitgehaald heeft.
De oplossing die ik zelf vond (maar met grote tabellen VEEL te traag gaat) is het result opnieuw te joinen op de MIN() waarden waardoor wel de goede records geselecteerd worden.
Nu de vraag:
Is er een manier om dit voor elkaar te krijgen zonder te joinen op een subquery?
Nu even een simpel voorbeeld om te omschrijven wat ik wil... eerst even een simpele test table:MIN([DISTINCT] expr)
Returns the minimum value of expr. MIN()
code:
1
2
3
4
5
| CREATE TABLE test1 (id INT, name VARCHAR(10), test2id INT); CREATE TABLE test2 (id INT, value INT); INSERT INTO test1 VALUES (1,'aaa',1),(2,'bbb',1),(3,'bbb',2),(4,'bbb',3),(5,'aaa',2); INSERT INTO test2 VALUES (1,10),(2,8),(3,6); |
Stel de query:
code:
1
2
3
4
5
6
7
8
9
| SELECT test1.id, test1.name, min(test2.value) as minimal FROM test1 INNER JOIN test2 ON test1.test2id = test2.id GROUP BY test1.name |
Deze geeft als resultaat:
code:
1
2
3
4
| id | name | minimal ---+------+-------- 1 | aaa | 8 2 | bbb | 6 |
De name en minimal kolom zijn logisch. Alleen ik wil dus dat hij het bijbehorende record wordt meegeselecteerd. In dit voorbeeld dus:
code:
1
2
3
4
| id | name | minimal ---+------+-------- 5 | aaa | 8 4 | bbb | 6 |
Aangezien record #4 uit test1 die minimale waarde heeft. Op geen enkele manier "tagged" MIN() het record waaruit hij de minimale waarde uitgehaald heeft.
De oplossing die ik zelf vond (maar met grote tabellen VEEL te traag gaat) is het result opnieuw te joinen op de MIN() waarden waardoor wel de goede records geselecteerd worden.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| SELECT test1.id, test1.name, tmp.minimal FROM test1 INNER JOIN test2 ON test1.test2id=test2.id INNER JOIN (SELECT test1.name, min(test2.value) as minimal FROM test1 INNER JOIN test2 ON test1.test2id = test2.id GROUP BY test1.name) as tmp ON (tmp.name = test1.name AND tmp.minimal = test2.value) GROUP BY test1.name |
Nu de vraag:
Is er een manier om dit voor elkaar te krijgen zonder te joinen op een subquery?