2016-03-31 29 views
1

aşağıdaki sorguda bazı garip sonuçlarıyla karşılaşabilirsiniz:Eksik değerler

sonuç şöyle
SET @indi_id = 768; 
SET @generations = 8; 

SELECT num, sosa, seq, len, dernier, ful_ful_nom 
FROM fullindi 
LEFT JOIN lignee_new 
ON ((ful_indi_id = dernier) AND (len BETWEEN 1 AND @generations)) 
RIGHT JOIN numbers 
ON ((sosa = num) AND (premier = @indi_id)) 
WHERE num BETWEEN 1 AND pow(2, @generations) 
GROUP BY num 
ORDER BY num; 

:

enter image description here

Neden satır sadece tam NULL önce bir doesn Mevcut değerleri 'sosa', 'len', 'dernier', ful_ful_nom ') ancak sadece' seq 'değerini görüntüleyiniz (bu örnekte satırlar ve 'a bakın)?

Neyi eksik?

tablo lignee_new:

enter image description here

tablo fullindi:

enter image description here

+1

Bu güzel bir soru, ancak verileri görmemiz gerekiyor mu? – JonH

+0

Katılıyorum, verileri görmesi gerekir, ancak boş bırakılan sağ veya sol birleştirmede. –

+0

Başka bir olasılık, satırdaki satırda NUM alanı bulunan verilerin nerede kesilebileceği. –

cevap

1

sorun MySQL gerçekten aptal şeyler bir yapmasıdır istediği gibi

, burada verilerdir Toplama işlevi tanıtıldı veya GROUP BY dahil, ancak dahil değil Tüm alanlar bir Toplu İşlevi veya GROUP BY.

Sen GROUP BY num bunu soruyorsunuz ancak SELECT diğer sütunların hiçbiri Grubu BY dahildir ne de bir fonksiyonu (SUM, MAX, MIN, AVG, vb ..)

ile Toplanmakta olan Başka bir RDBMS'de bu sorgu çalıştırılamaz ve bir hata verir, ancak MySQL sadece devam eder. Her bir alan için num olmayan değerlerin, innoDB ve başka herhangi bir kişi tarafından kullanıldığında farklı olabilen veri deposunda bulduğu ilk değeri yakalayarak hangi değeri göstermesi gerektiğine karar vermek mantığı kullanır.

Benim tahminim GROUP BY num ve başka bir şey, sadece birden fazla kayıtları nerede num=43 rastgele değerleri alır ve bunları görüntüler beri durumda 43'e bir num sahiptir lignee_new birden fazla kayıt var olmasıdır ... Makul olan Onları bir toplama işlevine dahil etmeyerek, “Bu diğer alanlar için ne görüntülediğinizi umursamıyorum, sadece bir şeyler getirin” ve MySQL'in yaptığı gibi.

GROUP BY maddesini tamamen kaldırırsanız, anlamlı olan verileri görürsünüz. Gereksiz durumlardan veya ihtiyacınız olmayan diğer şeylerden kurtulmak için kayıtlarınızı daha da filtrelemek için WHERE kullanın (filtrelemek için GROUP BY'u kullanmayın).

+0

Cevabınız bana çok yardımcı oldu. GROUP BY alanında başka bir sütun ekleyerek sorunu çözdüm. Dersi tutacağım. Çok teşekkürler. – mlh

+0

Sorunu çözdüğüne sevindim! MySQL hakkında pek sevmediğim bir şey var, ama bu bir şey listenin en üstünde. Bu çok karışıklığa neden oluyor. – JNevill