2016-07-27 2 views
1

Es ist eine Art Herausforderung. Die erwartete Leistung, alle Früchte sind von Ny oder ak Zustand und wenn die Marke gut = Preis 10 und schlecht = Preis 20 und OK = Preis 40. Also, Apfel aus ny Staat, haben gute und schlechte Marke den Preis 10 und 20, und Apfel haben keine Mark OK-Zeile, also brauchen Sie das nicht zu vergleichen. Banana Mark schlecht = Preis 20, aber OK ist nicht Preis 40, also werde ich Banana ausschließen. Birne Match OK = Preis 40 und Zustand = Ny und keine Reihen von guten und schlechten Mark. Daher sollte meine Ausgabe Apfel und Birne sein. Wie soll ich das machen?Basis auf dieser Tabelle, wie bekomme ich die erwartete Ausgabe mysql PHP?

<?php 
 
/* 
 
fruit state price mark 
 
apple ny  10 good 
 
apple ny  20 bad 
 
banana ny  20 bad 
 
banana ny  30 OK 
 
pear ny  40 OK 
 
berry pa  10 good 
 
*/ 
 

 
/*this is my best query but fail to do what I expected*/ 
 
SELECT fruit FROM table WHERE state IN ('ny','ak') AND mark IN ('good', 'bad', 'OK') AND price IN ('10','20','40') GROUP BY fruit \t 
 
?>

+0

Ist der Wert wörtlich "NULL" als String? Oder 'NULL' als Wert? – tadman

+1

Wenn Sie sagen, "was ich nicht erwarte", was ist das Ergebnis, das Sie mit dieser Abfrage erhalten? Können Sie Ihre Frage so bearbeiten, dass sie das aktuelle Ergebnis im Vergleich zum gewünschten Ergebnis enthält? –

Antwort

0

sollten Sie, wo und oder Zustand

Sie sollten ein Paar nicht verwenden in

select distinct fruit from my_table 
where fruit not in (select distinct fruit from my_table 
    where (mark, price) not in (select 'good', 10 from dual 
          union 
          select 'bad, 20 from dual 
          union 
          select 'OK', 40 from dual)) 
state IN ('ny','ak') ; 
+0

Danke für die Antwort, Sie Code ist gut, nur für ein Problem. In der Mark-Spalte (gut, schlecht, OK), wenn ein Wert nicht übereinstimmt, möchte ich Obst ausschließen. Wie die Banane mit dem Preis der schlechten Marke übereinstimmt, aber nicht mit der 40 auf der OK-Marke übereinstimmt, also entferne sie. Ihre Anfrage wird Banane ausgeben, weil sie mit dem Preis 20 auf der schlechten Marke übereinstimmt. – conan

+0

Ich habe die Antwort aktualisiert .. Hoffnung ist die richtige – scaisEdge

0

Die Liste der möglichen Früchte, die zurückgegeben werden konnte, weil ein Reihe entspricht der Spezifikation:

SELECT t.fruit 
    FROM `table` t 
WHERE t.state IN ('ny','ak') 
    AND ((t.mark = 'good' AND t.price = 10) 
     OR (t.mark = 'bad' AND t.price = 20) 
     OR (t.mark = 'OK' AND t.price = 40) 
     ) 
GROUP BY t.fruit 

Eine Liste der Früchte, die wir nicht zurückkehren wollen, weil es eine Reihe ist, die nicht der Spezifikation nicht erfüllt:

SELECT t.fruit 
    FROM `table` t 
WHERE t.state IN ('ny','ak') 
    AND NOT (t.mark = 'good' AND t.price = 10) 
    AND NOT (t.mark = 'bad' AND t.price = 20) 
    AND NOT (t.mark = 'OK' AND t.price = 40) 
GROUP BY t.fruit 

Beachten Sie, dass dies auch Zeilen enthalten wird, wenn die Marke Spalte a hat Wert außer gut, schlecht oder OK. Wenn wir Zeilen mit anderen Werten der Markierung ignorieren möchten, würden wir hinzufügen ...

AND t.mark IN ('good','bad','OK') 

Das gibt uns zwei Sätze. Wir können diese mit einer Anti-Join-Operation kombinieren. Als ein Beispiel für, wie das aussieht, wenn wir Tische hatten fruit_to_include und fruit_to_exclude ...

SELECT i.fruit 
    FROM fruit_to_include i 
    LEFT 
    JOIN fruit_to_exclude e 
    ON e.fruit = i.fruit 
WHERE e.fruit IS NULL 
ORDER BY i.fruit 

wir diese Platzhalter Tabellennamen mit Inline-Ansichten ersetzen können, die Abfragen verwenden, die uns die Früchte geben aufzunehmen und Früchte ausschließen. Der einzige Unterschied besteht darin, den Dummy-Tabellennamen durch (wie MySQL lautet) abgeleitete Tabelle zu ersetzen.

SELECT i.fruit 
    FROM -- fruit_to_include 
     (SELECT t.fruit 
      FROM `table` t 
      WHERE t.state IN ('ny','ak') 
      AND ((t.mark = 'good' AND t.price = 10) 
       OR (t.mark = 'bad' AND t.price = 20) 
       OR (t.mark = 'OK' AND t.price = 40) 
       ) 
      GROUP BY t.fruit 
     ) i 
    LEFT 
    JOIN -- fruit_to_exclude 
     (SELECT r.fruit 
      FROM `table` r 
      WHERE r.state IN ('ny','ak') 
      AND r.mark IN ('good','bad','OK') 
      AND NOT (r.mark = 'good' AND r.price = 10) 
      AND NOT (r.mark = 'bad' AND r.price = 20) 
      AND NOT (r.mark = 'OK' AND r.price = 40) 
      GROUP BY r.fruit 
     ) e 
    ON e.fruit = i.fruit 
WHERE e.fruit IS NULL 
ORDER BY i.fruit 
Verwandte Themen