Hergebruik van Select

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bastiaan

Bastiaan

20/06/2009 11:54:00
Quote Anchor link
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!
 
PHP hulp

PHP hulp

29/03/2024 03:38:18
 
Tikkes C

Tikkes C

20/06/2009 12:04:00
Quote Anchor link
zet eens tussen haken ()

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

zo doe ik t altijd...
 
Bastiaan

Bastiaan

20/06/2009 12:08:00
Quote Anchor link
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...
 
Joren de Wit

Joren de Wit

20/06/2009 12:55:00
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT
  tbl.integer + 10 AS statement1,
  tlb.integer + 10 + 5 AS statement2

Maar dan ben ik wel nieuwsgierig waarom je dit nodig hebt?
 
Bastiaan

Bastiaan

20/06/2009 13:01:00
Quote Anchor link
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
 
Joren de Wit

Joren de Wit

20/06/2009 13:12:00
Quote Anchor link
Mja, dan zou je met variabelen moeten gaan werken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
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.
 
Bastiaan

Bastiaan

20/06/2009 13:30:00
Quote Anchor link
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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.