2011-06-15 35 views
5

Bu soruyu nasıl telaffuz edeceğimi tam olarak bilmiyorum ama işte burada. Başka bir değeri hesaplamak için sorgumda hesapladığım değerleri yeniden kullanmak istiyorum. Değişkenler doğru kelimedir sanırım. İşte benim sorgu: i SUM (t1.totalEvents) tarafından döndürülen değeri kullanmak isteyenMysql - hesaplanan değerleri yeniden kullanma

SELECT 
    t1.label as label,SUM(t1.totalEvents) as Entry,SUM(t2.totalEvents) as Back, 
    ROUND(Entry/Back*100,2) as 'Rate' 
FROM 
    trackReports_daily t1 
.... rest of query ... 

İç yuvarlak, ama Entry kullandığınızda i Unknown column 'Entry' in 'field list'

Başka nasıl alabilirim bu hatayı olsun böyle her şey yeniden hesaplamadan oraya değeri:

ROUND(SUM(t2.totalEvents)/SUM(t1.totalEvents)*100,2) 
+0

İlgili: http://stackoverflow.com/questions/1368084/can-i-re-use -an-expression-in-a-mysql-sorgu-as-a-değişken-için-başka-alan –

+0

olası bir kopyası [SELECT sorgusunda hesaplanmış bir alanı yeniden kullanabilir miyim?] (http://stackoverflow.com/ sorular/6085443/can-i-resuse-a-hesaplanmış alan-in-a-select-sorgu) –

cevap

5

:

SELECT label, Entry, Back, ROUND(Entry/Back*100,2) as 'Rate' 
FROM (
    SELECT SUM(t1.totalEvents) as Entry, SUM(t2.totalEvents) as Back, t1.label as label 
    FROM trackReports_daily t1 
    .... rest of query ... 
) as temp; 
+1

Bu en hızlı sorgu, teşekkürler efendim – Ibu

1

Seçeneklerden biri gibi FROM yan tümcesinde bir alt sorgu kullanmak olacaktır:

SELECT 
    t1.label as label,SUM(t1.totalEvents) as Entry,t2.Back, 
    ROUND(t1.Entry/t2.Back*100,2) as 'Rate' 
FROM 
    (SELECT *, SUM(totalEvents) as Entry FROM trackReports_daily) t1 
    (SELECT *, SUM(totalEvents) as Back FROM someTable) t2 
.... rest of query ... 

Yeniden kullanmak istiyorsanız Daha fazla sorunda derecelendirin, o zaman karmaşıklaşacaktır ve bunun en iyi performansa sahip olup olmayacağını bilmiyorum, ancak sizin örnekte istediklerinizi yapacağını düşünüyorum.

Bir alt sorgu kullanabilirsiniz
10

Bu örnekte bir göz atın

select (select @t1:=sum(field1)),(select @t2:=sum(field2)),@t1/@t2 from table 
+0

Bu aslında en iyi cevaptır. MySQL'te yapmak çok kolay, ancak bu özelliği bilmeyen çoğu kişi alt sorguları kullanma eğilimindedir. –

+1

MySQL belgelerine göre "kullanıcı değişkenlerini içeren ifadeler için değerlendirme sırası tanımlanmamış" http://dev.mysql.com/doc/refman/5.6/en/user-variables.html Bu çözüm güvenli midir? – Andrea

+1

Bu iyi bir uygulama değil; sonuçlar garanti edilmez. MySQL kılavuzu: "SET deyimleri dışındaki genel bir kural olarak, bir kullanıcı değişkenine asla bir değer atamamalısınız ...". "SELECT gibi diğer ifadeler için beklediğiniz sonuçları alabilirsiniz, ancak bu garanti edilmez". – bbe

İlgili konular