Merkwürdige Ergebnisse MySQL WHERE AND...
hawkmaster1
- mysql
0 dedlfix0 hawkmaster10 dedlfix
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
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.
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
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.