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

Beitrag lesen

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