我在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
还有其他办法吗?
请帮助
答案 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
答案 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);
这是我在此查询中所做的事情。
注意:我已经对其进行了测试,因此您可能需要对查询进行一些更改。