Hergebruik van Select
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!
(tbl.integer + 10) AS statement1,
(statement1 + 5) AS statement 2
zo doe ik t altijd...
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...
De oplossing is dus:
Maar dan ben ik wel nieuwsgierig waarom je dit nodig hebt?
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
Code (php)
1
2
3
4
5
2
3
4
5
SELECT
@var := tbl.integer + 10 AS statement1,
@var + 5 AS statement2
FROM
tabel AS tbl
@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.
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