选择左连接两个表,其中今天是在第二个表中的两个日期时间列之间

时间:2012-06-27 07:55:36

标签: mysql

编辑为了进一步简化此操作。

让我们来看看这个结构:

  

表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被设置。如果两列都是零,则返回产品。

2 个答案:

答案 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

的记录