2013-10-30 30 views
6

私はこのクエリを持っており、その選択肢の逆数を選択したいと思います。SQL文 - このクエリの逆を選択してください

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 

私の問題を簡単に解決する方法はありますか?

+1

"逆"を定義しますか?例を上げてください。 – NoChance

+1

それはあなたがその逆を意味するかによって異なります。一つの答えは "IN"を "NOT IN"に変更することです。別の答えは、 "HAVING ... = 1"を "HAVING ... <> 1"に変更することです。または両方を行う。なんでしょう? –

+0

このクエリは、自分の状態に対応するガイドのIDを返します。私はこのクエリで選択されているものを除いてすべてのガイドを取得したい –

答えて

12

単純にこのクエリを使用します。

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

ありがとう、完璧! –

+0

@ user2463750その後、承認済みとマークします。あなたを助ける喜び。 –

+0

MySQLに「EXCEPT」はありませんか?私はあなたにいくつかのパフォーマンスの問題を与えないと信じています – Schalk

0

は、あなたがこの

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

を探しているかもしれあなたはブール値を反転させることができます。 ;)

私は大量のフィルタがあり、特定の除外フィルタセットがあるときにこれを行います。私はそれらをケースの中に書き込んで、除外する=1と除外したものを見つけるために=0をします。

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 
関連する問題