Goedendag,

ik had een vraag over het hergebruiken van een select statement. Ik wil ongeveer uitkomen op de volgende query;

SELECT
tbl.integer + 10 AS statement1,
statement1 + 5 AS statement2
FROM tbl

Heeft iemand enig idee hoe dit opgelost kan worden. Voorbeeldje is uiteraard erg simpel, de query die ik nu gebruik is erg groot en heb geen zin om Mysql opnieuw door alle berekeningen te laten lopen.
Alvast bedankt!
zet eens tussen haken ()

(tbl.integer + 10) AS statement1,
(statement1 + 5) AS statement 2

zo doe ik t altijd...
Dat heeft weinig effect. Heb het voorbeeld iets versimpeld zodat het makkelijker testen is;

SELECT
1 AS value1
value1 + 10 AS value2

Dit geeft errors. Op een of andere manier moet ik Mysql vertellen dat value1 van het vorige select statement komt...
Dat gaat je niet lukken, in ieder geval niet op die manier. Je kunt de alias value1 niet in dezelfde SELECT clausule gebruiken, de waarde is immers nog niet bepaald en daar struikelt MySQL over.

De oplossing is dus:

SELECT
  tbl.integer + 10 AS statement1,
  tlb.integer + 10 + 5 AS statement2

Maar dan ben ik wel nieuwsgierig waarom je dit nodig hebt?
Het gaat om de volgende query. Deze berekent 3 waardes; resultaat, bonus en trui (gaat om een tourdekans spel :) ). Deze drie waardes wil ik bij elkaar optellen en uiteraard niet door alle berekeningen nog een keer uit te voeren voor de kolom totaal. Meer nog om snelheid dan om het knip en plakwerk;

SELECT
de.naam,de.ploegnaam,

SUM(
IF(dr.nummer<16 && re.positie<11,
CASE re.positie
WHEN 1 THEN 12
WHEN 2 THEN 10
WHEN 3 THEN 8
WHEN 4 THEN 7
WHEN 5 THEN 6
WHEN 6 THEN 5
WHEN 7 THEN 4
WHEN 8 THEN 3
WHEN 9 THEN 2
WHEN 10 THEN 1
END
,0)
) resultaat,

SUM(
IF(dr.nummer<16 && re.positie<11,
IF(dr.nummer=re.positie,IF(re.positie<6,3,2),0)
,0)
) bonus,


SUM(
IF(dr.nummer>15 && re.positie>10 && re.etappe=20,
IF(dr.nummer=re.positie+5,IF(re.positie=11,30,20),0)
,0)
) trui

FROM
tdk_deelnemer de
JOIN tdk_deelnemer_renner dr
ON de.id = dr.deelnemer
JOIN tdk_resultaten2 re
ON dr.renner = re.renner
WHERE dr.nummer<16 && re.positie<11 || re.etappe=20
GROUP BY de.id
ORDER BY resultaat DESC
Mja, dan zou je met variabelen moeten gaan werken:

SELECT
  @var := tbl.integer + 10 AS statement1,
  @var + 5 AS statement2
FROM
  tabel AS tbl

Dit zou een oplossing voor je probleem kunnen zijn.

Maar als ik zo naar je query kijkt, klopt er nog iets niet. De GROUP BY is namelijk niet volledig. Daarin hoor je alle kolommen uit je SELECT, die geen onderdeel zijn van een aggregatie functie (zoals SUM), op te nemen. Zie ook deze tutorial over het juiste gebruik van GROUP BY.
Thanks Blanche! Was effe uitvogelen maar moest uiteraard de var definieren binnen de SUM en daarna de variabelen op;tellen en summen. Je hebt gelijk wat betreft de Group By, beetje gemakkelijk, naam en ploegnaam zijn altijd hetzelfde voor een gegeven id, dus output blijft correct. Heb hem wel even netjes aangepast :) Zo ie ie geworden;

SELECT
de.naam,de.ploegnaam,

SUM(
@var_regulier :=
IF(dr.nummer<16 && re.positie<11,
CASE re.positie
WHEN 1 THEN 12
WHEN 2 THEN 10
WHEN 3 THEN 8
WHEN 4 THEN 7
WHEN 5 THEN 6
WHEN 6 THEN 5
WHEN 7 THEN 4
WHEN 8 THEN 3
WHEN 9 THEN 2
WHEN 10 THEN 1
END
,0)
) regulier,

SUM(
@var_bonus :=
IF(dr.nummer<16 && re.positie<11,
IF(dr.nummer=re.positie,IF(re.positie<6,3,2),0)
,0)
) bonus,


SUM(
@var_trui :=
IF(dr.nummer>15 && re.positie>10 && re.etappe=20,
IF(dr.nummer=re.positie+5,IF(re.positie=11,30,20),0)
,0)
) trui,

SUM(@var_regulier + @var_bonus + @var_trui) totaal

FROM
tdk_deelnemer de
JOIN tdk_deelnemer_renner dr
ON de.id = dr.deelnemer
JOIN tdk_resultaten2 re
ON dr.renner = re.renner
WHERE dr.nummer<16 && re.positie<11 || re.etappe=20
GROUP BY de.id, de.naam, de.ploegnaam
ORDER BY totaal DESC

Reageren