0

EDITこれをさらに簡素化するために。

この構造を見てみましょう。

表 1: idProduct (int) | 名前 (varchar)

表 2: idDay (整数) | idProduct (整数) | date_start(日時) | date_end (日時)

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 が設定されている場合に適用されます。両方の列がゼロの場合、積を返します。

4

2 に答える 2

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 と end_date が同じ idDay を共有していなくても、製品に今日 (または 0) よりも小さい start_date が少なくとも 1 つと、今日 (または 0) よりも大きい end_date が少なくとも 1 つあるかどうかを確認する場合:

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))

かかる :

最小 start_date = 0 および最大 end_date = 0

最小 start_date = 0 および最大 end_date >= 今日

最小 start_date <= 今日、最大 end_date =0

min start_date <= 今日 and max end_date >= 今日

于 2012-06-27T08:12:50.960 に答える
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())

編集済み

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 のレコードは選択されません。

于 2012-06-27T08:10:14.300 に答える