2013-10-30 2 views
6

Ich habe diese Abfrage und ich möchte die Umkehrung auswählen, was diese auswählen.SQL-Anweisung - Wählen Sie die Umkehrung dieser Abfrage

SELECT Guide.id FROM Guide 
INNER JOIN GuideAvailability ON Guide.id = GuideAvailability.guideId 
WHERE GuideAvailability.startDate IN (1377946800) 
GROUP BY GuideAvailability.guideId 
HAVING COUNT(DISTINCT GuideAvailability.id) = 1 

Gibt es eine einfache Möglichkeit, mein Problem zu lösen?

+1

"Inverse" definieren? Nenne Beispiele. – NoChance

+1

Es hängt davon ab, was Sie mit der Umkehrung meinen. Eine Antwort ist die Änderung "IN" zu "NICHT IN". Eine andere Antwort besteht darin, "HAVING ... = 1" zu "HAVING ... <> 1" zu ändern. Oder mach beides. Was willst du? –

+0

Diese Abfrage gibt die ID des Guides zurück, die meiner Bedingung entspricht. Ich möchte alle Führer erhalten, ausgenommen diejenigen, die in dieser Abfrage ausgewählt sind –

Antwort

12

Verwenden Sie einfach diese Anfrage:

SELECT * 
    FROM Guide where id NOT IN (
     SELECT Guide.id 
     FROM Guide 
     INNER JOIN GuideAvailability ON Guide.id = GuideAvailability.guideId 
     WHERE GuideAvailability.startDate IN (1377946800) 
     GROUP BY GuideAvailability.guideId 
     HAVING COUNT(DISTINCT GuideAvailability.id) = 1 
    ) 
+0

Vielen Dank, perfekt! –

+0

@ user2463750 dann als akzeptiert markieren. Ich freue mich, Ihnen zu helfen. –

+0

Gibt es in MySQL kein "EXCEPT"? Ich glaube, NOT IN gibt Ihnen einige Leistungsprobleme – Schalk

0

können Sie sich auf der Suche nach diesem

SELECT Guide.id FROM Guide 
INNER JOIN GuideAvailability ON Guide.id = GuideAvailability.guideId 
WHERE GuideAvailability.startDate NOT IN (1377946800) GROUP BY GuideAvailability.guideId HAVING COUNT(DISTINCT GuideAvailability.id) <> 1 
0

Sie die Bool Flip kann. ;)

Ich mache das, wenn ich eine große Menge von wo Filter habe und es gibt einen spezifischen Ausschluss Satz von Filtern. Ich schreibe sie in das Gehäuse und mache =1 zum Ausschließen und =0 um zu finden, was ich ausgeschlossen habe.

SELECT Guide.id FROM Guide 
INNER JOIN GuideAvailability ON Guide.id = GuideAvailability.guideId 
WHERE (case when GuideAvailability.startDate IN (1377946800) then 1 else 0 end) = 0 
GROUP BY GuideAvailability.guideId 
HAVING COUNT(DISTINCT GuideAvailability.id) = 1