如果在SELECT Query中首先匹配,如何跳过其他OR条件?

时间:2014-07-09 09:46:10

标签: php mysql sql

我在OR内遇到SELECT条件时出现问题。

如果匹配一个条件且不应使用其他OR条件,我想要一个简单的结果。

我想要的是:

我有一些用户共享记录,我想通过电子邮件向他们发送我网站上分享的最新项目。

  

对我来说:最新的项目将至少提前两天

     

就像今天是第9名,所以我想拉出第7名的所有记录。但如果我   没有得到任何第7记录然后我想拉出所有记录   6日(距离今天3天)。如果我没有在6日获得任何记录   我想从今天起拉一天。

对于所有这些我在我的OR查询中使用了SELECT,如下所示:

SELECT `tg`.* FROM `tblgallery` AS `tg` WHERE (
(tg.added_date BETWEEN '2014-07-07 00:00:00' AND '2014-07-08 00:00:00') OR 
(tg.added_date BETWEEN '2014-07-06 00:00:00' AND '2014-07-07 00:00:00') OR 
(tg.added_date BETWEEN '2014-07-08 00:00:00' AND '2014-07-09 00:00:00') )

我的数据库中有日期记录:

2014-07-06
2014-07-07

当我运行此查询时,它会向我提供两个日期的所有记录。

但我只需要记录2014-07-07而不是两者的记录。(我已在上面提到过。)

我知道我可以通过使用多个Select来做到这一点,我认为一次又一次地请求数据库不是一个好主意。

我的问题是:如果第一场比赛是真的,如何从数据库中提取数据?并跳过所有休息日期的数据?

OR

还有其他办法吗?

请帮助

4 个答案:

答案 0 :(得分:2)

尝试此查询:

SELECT GalleryID, PixName, A.added_date
FROM tblGallery A
INNER JOIN (
  SELECT added_date FROM tblGallery
  WHERE added_date <= DATE_SUB('2014-07-09 00:00:00', interval 2 day) 
  GROUP BY added_date
  ORDER BY added_date DESC
  LIMIT 1 ) B
ON A.added_date = B.added_date

查看我的 SQL Fiddle Demo

即使日期超过2天,它仍然可以使用。 请参阅下面的演示,其中最新的是2014年7月9日之后的4天

请参阅 2nd Demo

如果您想要当前日期而不是像这里的文字日期那么您可以使用CURDATE()函数。如下所示:

SELECT GalleryID, PixName, A.added_date
FROM tblGallery A
INNER JOIN (
 SELECT added_date FROM tblGallery
 WHERE added_date <= DATE_SUB(CURDATE(), interval 2 day) 
 GROUP BY added_date
 ORDER BY added_date DESC
 LIMIT 1 ) B
ON A.added_date = B.added_date

参见 3rd Demo

答案 1 :(得分:2)

通常只会使用LIMIT,这在此处不适用,因为每天可能会有很多行。我所做的与LIMIT非常相似。

SELECT * FROM (
   SELECT
   tg.*,
   @gn := IF(DATE(tg.added_date) != @prev_date, @gn + 1, @gn) AS my_group_number,
   @prev_date := DATE(tg.added_date)
   FROM tblgallery tg
   , (SELECT @gn := 0, @prev_date := CURDATE()) var_init
   ORDER BY FIELD(DATE(tg.added_date), CURDATE() - INTERVAL 1 DAY, CURDATE() - INTERVAL 3 DAY, CURDATE() - INTERVAL 2 DAY) DESC
) sq
WHERE my_group_number = 1;

这是它的工作原理。

使用此行

   , (SELECT @gn := 0, @prev_date := CURDATE()) var_init

变量已初始化。

然后ORDER BY很重要! FIELD() function将行从2 days ago(获取值3)到3 days ago(获取值2)排序到1 day ago(获取值1)。其他一切都获得了价值0.

然后在SELECT条款中,顺序也很重要。

使用此行

   @gn := IF(DATE(tg.added_date) != @prev_date, @gn + 1, @gn) AS my_group_number,

当当前行的日期与上一行的日期不同时,变量@gn会递增。

使用此行

   @prev_date := DATE(tg.added_date)

将当前行的日期分配给变量@prev_date。在上面的行中,它仍然具有前一行的值。

现在,这些条目在1列中的my_group_number列表中包含最新日期

2 days ago
3 days ago
yesterday
4 days ago
5 days ago
...

答案 2 :(得分:0)

好吧,我无法解决多OR问题,但这就是你怎么能在最近两天内添加记录。更改间隔或CURDATE()以满足您的需求。

SELECT id, date_added
FROM gallery
WHERE date_added BETWEEN CURDATE() - INTERVAL 2 DAY AND CURDATE()
ORDER BY date_added

检查SQL Fiddel

答案 3 :(得分:0)

这不是关于OR如何在MySQL中运行。 我认为你通过查看@B.T的讨论来误解哪一部分。 它将针对每条记录执行。 因此,如果其中一个记录的第一个条件的评估结果为false,那么它将评估该特定记录的第二个条件,依此类推,如果任何条件通过考虑所有条件而评估为真,那么它将成为结果集的一部分。 / p>

尝试此查询。

SELECT `tg`.* FROM `tblgallery` AS `tg` WHERE tg.added_date = (
select date (
select distinct(tg.added_date) date from tblgallery as tg
) as t1 order by case  
                    when date between '2014-07-07 00:00:00' AND '2014-07-08 00:00:00'
                        then 1
                    when date between '2014-07-06 00:00:00' AND '2014-07-07 00:00:00'
                        then 2
                    when date between '2014-07-08 00:00:00' AND '2014-07-09 00:00:00'
                        then 3
                    else 4
                end limit 1);

这是我在此查询中所做的事情。

  • 我得到了所有不同的日期。
  • 然后我按顺序排列所有条件,即如果第一个条件为真则为1,如果第二个为真则为2,依此类推。
  • 我将结果限制为1,因此在订单结束后,将选择第一行,哪一个是日期,将在条件中使用。

注意:我已经对其进行了测试,因此您可能需要对查询进行一些更改。