hawkmaster1: Merkwürdige Ergebnisse MySQL WHERE AND...

Hallo zusammen, ich bin gerade etwas verwundert und ratlos. Ich möchte eine SQL Abfrage durch zusätzliche WHERE einschränken.

Folgende SQL war die Ausgangsbasis:

SELECT
    C.auftragid, C.auftragnumber, C.rating, C.description, C.statusid, B.customerid, B.customername, B.customernumber, B.landid, B.bscid, D.landname, E.bscname, F.statusname, DATEDIFF(CURDATE(), G.tododate) AS tododate, G.tododescription 
    
	FROM 
		tab_rel_customer_auftrag A
	JOIN
		tab_customer B ON B.customerid = A.customerid
	JOIN
		tab_auftrag C ON C.auftragid = A.auftragid
	JOIN
		tab_land D ON D.landid = B.landid
	JOIN
		tab_bsc E ON E.bscid = B.bscid
	JOIN
		tab_status F ON F.statusid = C.statusid
	LEFT JOIN
		tab_todo G ON G.auftragnumber = C.auftragnumber
	
	WHERE C.active = 1	

	ORDER BY C.auftragnumber ASC

Das Ergebnis ist 1781 Zeilen Jetzt wird zusätzlich das Ergebnis mit "AND C.statusid != 6" eingeschränkt

SELECT
	
    C.auftragid, C.auftragnumber, C.rating, C.description, C.statusid, B.customerid, B.customername, B.customernumber, B.landid, B.bscid, D.landname, E.bscname, F.statusname, DATEDIFF(CURDATE(), G.tododate) AS tododate, G.tododescription 
    
	FROM 
		tab_rel_customer_auftrag A
	JOIN
		tab_customer B ON B.customerid = A.customerid
	JOIN
		tab_auftrag C ON C.auftragid = A.auftragid
	JOIN
		tab_land D ON D.landid = B.landid
	JOIN
		tab_bsc E ON E.bscid = B.bscid
	JOIN
		tab_status F ON F.statusid = C.statusid
	LEFT JOIN
		tab_todo G ON G.auftragnumber = C.auftragnumber
	
	WHERE C.active = 1	
AND C.statusid != 6
	ORDER BY C.auftragnumber ASC

Ergebnis = 1371, 410 rows ausgefiltert, soweit ok.

Jetzt eine Einschränkung mit AND C.rating != 100 AND C.rating != 0

SELECT
	
    C.auftragid, C.auftragnumber, C.rating, C.description, C.statusid, B.customerid, B.customername, B.customernumber, B.landid, B.bscid, D.landname, E.bscname, F.statusname, DATEDIFF(CURDATE(), G.tododate) AS tododate, G.tododescription 
    
	FROM 
		tab_rel_customer_auftrag A
	JOIN
		tab_customer B ON B.customerid = A.customerid
	JOIN
		tab_auftrag C ON C.auftragid = A.auftragid
	JOIN
		tab_land D ON D.landid = B.landid
	JOIN
		tab_bsc E ON E.bscid = B.bscid
	JOIN
		tab_status F ON F.statusid = C.statusid
	LEFT JOIN
		tab_todo G ON G.auftragnumber = C.auftragnumber
	
	WHERE C.active = 1	
 AND C.rating != 100 AND C.rating != 0
	ORDER BY C.auftragnumber ASC

Ergebnis: 851, 930 rows ausgefiltert

Jetzt werden beide bzw. alle AND verknüpft. AND C.rating != 100 AND C.rating != 0 AND C.statusid != 6

SELECT
	
    C.auftragid, C.auftragnumber, C.rating, C.description, C.statusid, B.customerid, B.customername, B.customernumber, B.landid, B.bscid, D.landname, E.bscname, F.statusname, DATEDIFF(CURDATE(), G.tododate) AS tododate, G.tododescription 
    
	FROM 
		tab_rel_customer_auftrag A
	JOIN
		tab_customer B ON B.customerid = A.customerid
	JOIN
		tab_auftrag C ON C.auftragid = A.auftragid
	JOIN
		tab_land D ON D.landid = B.landid
	JOIN
		tab_bsc E ON E.bscid = B.bscid
	JOIN
		tab_status F ON F.statusid = C.statusid
	LEFT JOIN
		tab_todo G ON G.auftragnumber = C.auftragnumber
	
	WHERE C.active = 1	
 AND C.rating != 100 AND C.rating != 0 AND C.statusid != 6
	ORDER BY C.auftragnumber ASC

**Ergebnis 817, nur 34 rows gefiltert bzw. weniger

Erwartet hätte ich aber Ergebnis 441 rows und 1340 rows ausgefiltert**

Jetzt frage ich mich warum sich die Abfrage so verhält wenn man alle AND zusammenfasst?

Hat jemand eine Erklärung dafür?

viele Grüße hawk

  1. Tach!

    Jetzt frage ich mich warum sich die Abfrage so verhält wenn man alle AND zusammenfasst?

    Das Antwort wird wohl in den Daten begründet liegen. Das wirst du nur durch anschauen und vergleichen der Ergebnisse genau beantwortet bekommen. Vermutlich überschneiden sich die Ergebnismengen der Teilversuche.

    dedlfix.

    1. Hallo,

      Das Antwort wird wohl in den Daten begründet liegen. Das wirst du nur durch anschauen und vergleichen der Ergebnisse genau beantwortet bekommen. Vermutlich überschneiden sich die Ergebnismengen der Teilversuche.

      Ja, im moment wo ich das geschrieben habe ist mir auch klar geworden das ja so immer nach ALLEN 3 Zuständen gesucht wird bzw. zutreffen müssen, also eine Reihe die weder rating != 0 UND rating != 100 UND statusid != 6 hat.

      Ich weiss im Moment nur nicht wie man die Abfrage bzw. WHERE Klausel umbauen muss? Eigentlich möchte ich ja alles NICHT anzeigen wo die Spalte "rating" 0 oder 100 ist und wo die Spalte statusid 6 ist.

      Gruss hawk

      1. Tach!

        Eigentlich möchte ich ja alles NICHT anzeigen wo die Spalte "rating" 0 oder 100 ist und wo die Spalte statusid 6 ist.

        Menschliche Sprachlogik und Computerlogik unterscheiden sich. Das UND zwischen den beiden Teilbedingungen ist hier ein OR.

        dedlfix.