2017-03-13 25 views
0

我有一個表稱爲package選擇條件:在where子句

id name validity 
1 Free  NULL 
2 Basic 90 
4 Featured 80 
5 Premium 70 

而且我還有一個表廣告

id posted_on title package_id 
1 2016-09-29 test 1 
2 2015-09-29 test2 2 
3 2016-07-29 test3 4 

我有一個查詢,如:

SELECT * FROM ads AS ad WHERE (SELECT datediff(curdate(), posted_on) AS datecount) <= 180 

我想從表中取180package

if (package_id == 2){ 
    instead of 180 it will be 90 fetched form package table  
} 

有沒有一種方式,通過簡單的SQL查詢來實現這個

+0

可以使用CASE ..然後條款 – Randy

+0

真是奇怪。你爲什麼給這張桌子別名?你爲什麼使用子查詢?然後:爲什麼給這個子查詢一個別名?你沒有在你的查詢中使用它們中的任何一個。 – Psi

+0

其實我修改查詢從長查詢忘記刪除別名。我的壞。 –

回答

1

是查詢使用在包裝的有效性值的意圖,如果是這樣,那麼加入將是您的最佳選擇...

select ads.*, package.name, package.validity 
    from ads 
    join package on ( package.id=ads.package_id 
        and ( datediff(curdate(),ads.posted_on)<=package.validity 
         or package.validity is null)) 
+0

感謝您爲我工作的完美:) –

0

第一:我不明白您的查詢。爲什麼使用子查詢,而不只是這樣做:

SELECT * 
FROM ads 
WHERE datediff(curdate(), posted_on) <= 180 

,然後改變它的方式:

SELECT * 
FROM ads 
WHERE 
    datediff(curdate(), posted_on) <= case when package_id = 2 then 90 else 180 end 

我刪除我的回答所有別名,因爲它們不是在您的查詢中使用反正。

+0

好吧很好,這是工作perfect.However請你也請建議查詢NULL值?我不想有這個地方package_id = 1的條件 –

+0

什麼應該是NULL? – Psi

+0

在包表中當id = 1時有效性爲NULL所以只要刪除package_id = 1的條件 –