尝试使用具有不同模式的regexp在查询中两次过滤同一列

时间:2016-12-20 23:23:33

标签: php mysql

我对mysql和php查询相当新,除了基本的SELECT * FROM blah WHERE等等,所以我非常喜欢这里的东西。我试图根据天气状况和月相浏览照片。现在,天气,月相和照片存储在3个不同的表中,并且所有3个存储的日期不同。这是我无法控制的天气和月相,因为它们基于第三方api。

无论如何,这是我当前的疑问:

$pics = "SELECT * FROM photos WHERE cam_id IN ($cams)";
    if($moon == 1){ $pics .= " AND photo_date REGEXP '$phase_dates'";}
    if($cond == 1){ $pics .= " AND photo_date REGEXP '$cond_dates'";}

$ phase_dates和$ cond_dates的数据都是使用此代码的内爆数组:

$cond_dates = implode("|",$cond_date);
$phase_dates = implode("|",$phase_date);

唯一的区别是$ cond_dates需要更具体,因为每20分钟跟踪一次天气状况,而月相则是每天一次。因此,我使用:

date('Y:m:d H', $cdate);

表示$ cond_date,我使用:

date('Y:m:d',$pdate);

for $ phase_date。

对于条件,2016:11:16 09,以及2016:11:16为阶段。我的查询最终结果如下:

$pics = "SELECT * FROM photos 
WHERE cam_id 
IN ($cams) 
AND photo_date REGEXP '2016:11:16|2016:11:17' 
AND photo_date REGEXP '2016:11:16 09|2016:11:16 10|2016:11:17 09'";

但即使匹配,我也没有结果。当两个日期集都使用Y:m:d时,我得到匹配,但是当我添加小时时,没有结果。有没有办法获得比赛,而不会失去一小时的特异性?

1 个答案:

答案 0 :(得分:0)

它不匹配,因为photo_date不会是2016:11:16和2016:11:17同时。您需要在这里使用OR运算符。所以查询看起来像这样:

SELECT * FROM photos 
WHERE cam_id 
IN ($cams) 
AND (photo_date REGEXP '2016:11:16|2016:11:17' 
OR photo_date REGEXP '2016:11:16 09|2016:11:16 10|2016:11:17 09');