2017-03-13 143 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的条件 –