Mysql 在where子句中选择条件

Mysql 在where子句中选择条件,mysql,Mysql,我有一张名为package的表格: 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 * F

我有一张名为
package
的表格:

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

有没有一种方法可以通过单个SQL查询来实现这一点?首先:我不理解您的查询。为什么使用子查询而不只是这样做:

SELECT * 
FROM ads
WHERE datediff(curdate(), posted_on) <= 180
选择*
来自广告

其中datediff(curdate(),posted_on)是查询使用包中的有效值的目的,如果是这样,那么连接将非常适合您

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))
选择ads.*、package.name、package.validity
来自广告
在(package.id=ads.package\u id)上加入包

和(datediff(curdate(),ads.posted_on)你可以使用CASE..然后从句很奇怪。你为什么给表一个别名?你为什么使用子查询?然后:为什么给子查询一个别名?你在查询中没有使用任何别名。事实上,我从一个长查询中修改了查询,但忘了删除别名。我的不好。好吧,很好,这很好。不过,你也可以这样做吗建议查询空值?我不希望在包表中有包\u id=1的where条件什么应该为空?当id=1有效性为空时,只需删除包\u id=1的where条件
SELECT * 
FROM ads 
WHERE 
    datediff(curdate(), posted_on) <= case when package_id = 2 then 90 else 180 end
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))