2016-03-31 17 views
1

begegne ich einige seltsame Ergebnisse in der folgenden Abfrage:Fehlende Werte in einer Abfrage

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; 

Das Ergebnis sieht wie folgt aus:

enter image description here

Warum die Reihe kurz vor einer vollständigen NULL ein doesn 't die vorhandenen Werte' sosa ',' len ',' dernier ', ful_ful_nom') anzeigen, aber nur den 'seq' Wert (siehe Zeilen und in diesem Beispiel)?

Was fehlt mir?

Wie gewünscht, hier sind Daten:

Tabelle lignee_new:

enter image description here

Tabelle fullindi:

enter image description here

+1

Das ist eine gute Frage, aber wir müssen die Daten sehen? – JonH

+0

Stimmen Sie zu, müssen Sie die Daten sehen, aber es ist in der rechten oder linken Verknüpfung, die Nullen hinterlässt. –

+0

Eine andere Möglichkeit, die WHERE-Klausel könnte Daten ausschneiden, wo immer noch ein NUM-Feld die Zeile enthält. –

Antwort

1

Das Problem ist, dass MySQL ist wirklich dumm Dinge, wenn ein Aggregatfunktion wird eingeführt oder GROUP BY ist enthalten, aber nicht Alle Felder befinden sich in einer Aggregatfunktion oder GROUP BY.

Sie fragen es zu GROUP BY num aber keiner der anderen Spalten in Ihrer SELECT sind in der Gruppe BY enthalten, noch werden sie mit einer Funktion zu Gruppen zusammengefasst (SUM, MAX, MIN, AVG, etc ..)

In anderen RDBMS würde diese Abfrage nicht ausgeführt werden und würde einen Fehler auslösen, aber MySQL macht einfach weiter. Es verwendet die Logik, um zu entscheiden, welchen Wert es für jedes Feld zeigen soll, das nicht num ist, indem es einfach den ersten Wert in seinem Datenspeicher findet, der zwischen innoDB und allem, was andere Leute mehr verwenden, unterschiedlich sein kann.

Meine Vermutung ist, dass in Ihrem Fall, dass Sie mehr als einen Datensatz in lignee_new haben, die einen num von 43 hat, seit Sie GROUP BY num und sonst nichts, es Werte nur zufällig aus dem mehrere Datensätze packt wo num=43 und zeigt sie ... das ist vernünftig. Wenn Sie sie nicht in eine Aggregatfunktion einschließen, sagen Sie ziemlich genau: "Es ist mir egal, was Sie für diese anderen Felder anzeigen, bringen Sie einfach etwas zurück", und das tut MySQL.

Entfernen Sie Ihre GROUP BY Klausel vollständig und Sie werden Daten sehen, die Sinn ergeben. Vielleicht verwenden Sie WHERE, um Ihre Datensätze weiter zu filtern, um Nullen oder andere Dinge loszuwerden, die Sie nicht benötigen (verwenden Sie GROUP BY nicht zum Filtern).

+0

Ihre Antwort hat mir sehr geholfen. Ich löste das Problem, indem ich eine weitere Spalte in der GROUP BY hinzufügte. Ich werde die Lektion behalten. Vielen Dank. – mlh

+0

Ich bin froh, dass es das Problem gelöst hat! Es gibt eine Menge, die ich an MySQL nicht mag, aber diese eine Sache steht ganz oben auf der Liste. Es verursacht so viel Verwirrung. – JNevill

Verwandte Themen