2015-08-25 11 views
6

Tek bir ekip için çeşitli en uzun çizgileri listeleyen bir web sayfası oluşturuyorum ancak ilgili sonuç türlerinin bir bileşimi için bir çizgi hesaplamaya çalışırken bir sorunla karşılaştım. Aşağıdaki sorgu (veya benzeri) kullanılarakMySQL kullanarak en uzun yenilmeyen çizgi nasıl hesaplanır?

aşağıdaki gibi verileri bir tabloda sunulmuştur ...

 
date   result gf ga type  compfull 
-------------------------------------------------- 
1980-08-16  W  3 0 league Division 1 
1980-08-19  L  1 2 league Division 1 
1980-08-23  W  3 1 league Division 1 
1980-08-26  W  2 0 league Division 1 
1980-08-30  D  2 2 league Division 1 
and so on... 

, içeri attı kazanç veya kayıp, hatta oyunların en uzun koşmak belirleyebilir.

SELECT result, type, MIN(date) as StartDate, MAX(date) as EndDate, COUNT(*) as Games 
FROM (SELECT result, type, date, compfull, (SELECT COUNT(*) 
FROM resultengine R 
WHERE R.result <> RE.result 
AND R.date <= RE.date) as RunGroup 
FROM resultengine RE) A WHERE result='W' GROUP BY result, RunGroup ORDER BY Games 

Bu, here numaralı bulduğum mükemmel kaynağa dayanmaktadır. Ben bunu istiyorum tam olarak ne yapar ve bilmek istediğini söylüyor - Aynı Ben yenilmez oyunların en uzun çizgi hesaplamak için nasıl edilir çözemiyorum ne

result='L' 

geçtiğinizdeyse yani geçerlidir L. olmadan en uzun koşmak Ve aynı tersi.

Ben boşuna aşağıdaki sorguyu denedim: Yine

WHERE result='W' OR result='D' 

, bu işe yaramazsa:

SELECT result, type, MIN(date) as StartDate, MAX(date) as EndDate, COUNT(*) as Games 
FROM (SELECT result, type, date, compfull, (SELECT COUNT(*) 
FROM resultengine R 
WHERE R.result <> RE.result 
AND R.date <= RE.date) as RunGroup 
FROM resultengine RE) A WHERE result!='W' GROUP BY result, RunGroup ORDER BY Games 

Ben de sorguyu değiştirerek denedim. Her ikisi de, Ws veya Ls'nin en uzun çizgisini sunmak için kullanılan sorguyu yansıtma girişimleridir ve verilerimin manuel sayımı, bunun doğru olmadığını söyler. Hiç şüphe yok ki burada basit bir şey eksik, ama bu sorguyu nasıl uygulayabilirim ki bana Ls veya Ws ile sonuçların en uzun serisini anlatıyor?

select MAX(final.win_seq_count) from 

(Select date,result,gf,ga,type,compfull, 
@seq_count:=if(result="L",0,@seq_count:[email protected]_count+1) as win_seq_count, 
from resultengine,(select @seq_count:=0) t 


order by date) final 

Not:

+0

"Tek bir takımı" tanımlamak için hangi sütunları/sütunları kullanıyorsunuz? – seahawk

+0

@seahawk Bütün tablo bir takımın sonuçlarının bir koleksiyonudur - "gf" sütunu bu takımın attığı golleri içerir, oysa "ga" hedefleri kabul edilir. Bu sorguya uygun olmadığı düşünülen bir "rakip" sütunum var. Demek istediğin bu mu? –

+0

Lütfen cevabımı kontrol edin ve sizin için çalışıp çalışmadığını onaylayın. – seahawk

cevap

3

Extended. Aşağıdakiler kazançlar/çekilişler verir: Sorun, her zaman farklı sonuç kodları için farklı gruplamalar atanan 'WHERE R.result <> RE.result' ile oldu. Burada bu maddeyi (ve bazılarını) 'W' olarak değiştirdim ve tek bir kod yapmak için birlikte 'D':

SELECT result, TYPE, MIN(DATE) AS StartDate, MAX(DATE) AS EndDate, COUNT(*) AS Games 
FROM (SELECT result, TYPE, DATE, compfull, (SELECT COUNT(*) 
    FROM resultengine R 
    WHERE IF(R.result IN ('W','D'),1,0) <> IF(RE.result IN ('W','D'),1,0) 
    AND R.date <= RE.date) AS RunGroup 
FROM resultengine RE) A WHERE result IN ('W','D') GROUP BY IF(result IN ('W','D'),1,0), RunGroup ORDER BY Games 
+0

Teşekkürler @Giles - bu genel koşuları hesaplamak için harika çalışıyor. "H" veya "A" oyunlarını tanımlamak için "Mekan" adı verilen fazladan bir sütunum olsaydı, sorgu en uzun H oyunları veya A oyunları dizisini daha da geliştirebilir mi? –

+0

İnanıyorum ki, söylediklerinizden, 'sonuç' ile 'mekan' ve '(' W ',' D ') = = "H", =' A ') ya da IN (' H ile değiştirmeniz gerektiğini tahmin ediyorum. Her ikisi için ',' A '). – Giles

+0

Özür dilerim @Giles, belki de orada net değildim - Ws veya Ds (ya da her ikisi) mekanının en uzun dizgesini hesaplamak anlamına geliyordu. Bu yüzden, 'venue = H ekleniyor mu? 'ekstra bir' '' '' cümlesi olarak sorguya? –

1

Bu sorgu, tek takımın size maksimum yenilmez dizisi verecektir (tablo tek takımın verileri içeren Kod küçük sözdizimsel hata içeriyor olabilir kod örneğinden

İlgili konular