编辑为了进一步简化此操作。
让我们来看看这个结构:
表1:idProduct(int)|名称(varchar)
表2:idDay(int)| idProduct(int)| date_start(datetime)| date_end(datetime)
idProduct是两个表中的公共列。表2包含与此类似的数据:
0, 2, 11/22/2012, 11/22/2012
1, 2, 11/23/2012, 11/23/2012
2, 2, 11/24/2012, 11/24/2012
3, 2, 00/00/0000, 11/25/2012
4, 2, 11/25/2012, 00/00/0000
请注意,date_start,date_end或两者都可以全为零,在这种情况下,此上限或下限被视为未绑定/无限制。
在上述情况下,如果今天的日期介于date_start中的最早日期和date_end中的最新日期之间,我想选择ID为2的idProduct。 如果date_start为00/00/0000,则总是返回产品但是如果date_end是将来的话。反过来适用于date_end全部为零且date_start被设置。如果两列都是零,则返回产品。
答案 0 :(得分:1)
我在你的问题中没有看到“LEFT JOIN”要求:只在你的标题中。所以
SELECT t1.idProduct, t1.Name
FROM table1 t1
INNER JOIN table2 t2 ON t1.idProduct = t2.idProduct
WHERE DATE(t2.date_start) < DATE(NOW())--this will also take values with DATETIME = 0000
AND (DATE(t2.date_end) > DATE(NOW()) OR YEAR(t2.date_end) = 0)
GROUP BY t1.idProduct, t1.Name
或者如果你想检查产品是否至少有一个start_date小于今天(或0)并且至少有一个end_date比今天(或0)大,即使start_date和end_date不共享相同的idDay: / p>
SELECT t1.idProduct, t1.Name
FROM table1 t1
WHERE t1.idProduct IN
(SELECT t2.IdProduct
FROM table t2
GROUP BY t2.IdProduct
HAVING
MIN(t2.date_start) <= DATE(NOW()) AND
(MAX(t2.date_end) >= DATE(NOW()) OR YEAR(MAX(t2.date_end)) = 0))
需要:
min start_date = 0且max end_date = 0
min start_date = 0和max end_date&gt; = today
min start_date&lt; = today and max end_date = 0
min start_date&lt; = today and max end_date&gt; = today
答案 1 :(得分:0)
select
t1.idproduct,
t1.name
from table as t1
left join table2 as t2
on t1.idproduct = t2.idproduct
where date(date_start) < date(now())
and date(date_end) > date(now())
EDITED
select
t1.idproduct,
t2.idproduct,
t2.name
from table as t1
left join (select
max(idproduct),
name
from table2
where date(date_start) < date(now())
and date(date_end) > date(now())) as t2
on t1.idproduct = t2.idproduct
当然,它不会选择结束日期为00:00:00
的记录