2011-06-30 45 views
1

我不確定是否可以在一個查詢中執行此操作,但我希望。將兩個查詢合併爲一個

我需要所有的記錄是這樣的:

SELECT a.field_1, a.field_2, b.field_3, b.field_4 
    FROM tbl_a AS a, tbl_b AS b 
WHERE a.field_1 = b.field_3 

而且我想也排除這些記錄是屬於這種情況:

IF a.field_1 IN (1,2,3,4) 
AND a.field_date < NOW() 

UPDATE:(遺憾的混亂)

  • 因此,如果field_1等於1,2,3或4並且具有今天的日期時間戳,我需要顯示記錄(添加到結果)
  • 如果field_1等於1,2,3或4並且日期時間戳小於今天(將其從結果中刪除)。

任何想法得到兩個結果到一個查詢

說明(如果有差別):

  • field_a可以有一個值AZ,1-99(只有兩個字符)
+0

您想包含或排除滿足第二組條件的記錄嗎? –

+1

你說,並且「我想也排除這些記錄屬於這種情況:」,並且在你說「如果field_1等於1,2,3或4並且有一個日期時間戳,那麼今天我需要顯示記錄「,所以它必須顯示或不? –

+0

是包括如果日期是今天,排除如果日期小於今天,但只有當field_1是IN 1,2,3或4.對不起,任何混淆 –

回答

2

這樣的事情?

SELECT a.field_1, a.field_2, b.field_3, b.field_4 
FROM tbl_a AS a, tbl_b AS b 
WHERE a.field_1 = b.field_3 
AND (
CASE WHEN a.field_1 IN (1,2,3,4) THEN 
     CASE WHEN A.FIELD_DATE = NOW() THEN 1 ELSE 0 
     END 
ELSE 1 
END) = 1 
+0

嵌套的CASE,非常好。正在嘗試一個CASE,並沒有到達任何地方 –

+0

很高興聽到這有助於您:) –

0

這裏的,應該工作代碼:

SELECT a.field_1, a.field_2, b.field_3, b.field_4 
FROM tbl_a AS a 
INNER JOIN tbl_b AS b ON a.field_1 = b.field_3 
WHERE 
(a.field_1 IN (1,2,3,4) AND a.field_date = NOW()) 
OR 
(a.field_1 NOT IN (1,2,3,4)) 

注意,如果a.field是unsigned int類型= 0可以更換! a.field_1 IN (1,2,3,4)a.field_1 <=4a.field_1 NOT IN (1,2,3,4)a.field_1 > 4

這將使它在遇到大型記錄集時更快速

+0

此結果將只包含字段_1爲1,2,3或4的產品項。如果field_1標識符爲5或6 ?看起來這些值應該包括在內。我認爲這個帖子有點含糊。 –

+0

@N。沃菲爾德是這個職位是模糊的...我編輯了答案,以適應所需的結果 –

0

讓我們改寫這個有合適的聯合,並添加不上條件排除:

SELECT a.field_1, a.field_2, b.field_3, b.field_4 
    FROM tbl_a AS a JOIN tbl_b AS b ON (a.field_1 = b.field_3) 
WHERE NOT (a.field_1 IN (1,2,3,4) AND a.field_date < NOW()) 

由於NOT(x和y)相當於(NOT X)或(NOT Y),你也可以重寫此爲:

SELECT a.field_1, a.field_2, b.field_3, b.field_4 
    FROM tbl_a AS a JOIN tbl_b AS b ON (a.field_1 = b.field_3) 
WHERE a.field_1 NOT IN (1,2,3,4) OR a.field_date >= NOW()) 

但是我們還需要知道field_1或field_date是否可以爲NULL。如果是這樣,如果foo爲NULL,則表達式「foo NOT IN(blah)」返回NULL。所以你需要更具體一些。