ここでいくつかの投稿を読みましたが、特別なものではないようですが、最後の日のエントリを選択することはできません。
SELECT
p1.kArtikel,
p1.cName,
p1.cKurzBeschreibung,
p1.dLetzteAktualisierung,
p1.dErstellt,
p1.cSeo,
p2.kartikelpict,
p2.nNr,
p2.cPfad
FROM
tartikel AS p1 WHERE DATE(dErstellt) > (NOW() - INTERVAL 7 DAY)
INNER JOIN
tartikelpict AS p2
ON (p1.kArtikel = p2.kArtikel) WHERE (p2.nNr = 1)
ORDER BY
p1.kArtikel DESC
LIMIT
100;', $connection);
今日と過去7日間の間に追加すると、コードは何も出力しません。
WHERE
句の位置が間違っています。テーブル参照とJOIN操作に従う必要があります。
このようなもの:
FROM tartikel p1
JOIN tartikelpict p2
ON p1.kArtikel = p2.kArtikel
AND p2.nNr = 1
WHERE p1.dErstellt >= DATE(NOW()) - INTERVAL 7 DAY
ORDER BY p1.kArtikel DESC
[〜#〜] edit [〜#〜](3年以上後)
上記は本質的に「クエリにWHERE句を追加しようとしましたが、クエリはエラーを返しています。どうすれば修正できますか?」という質問に答えます。
「過去7日間」の日付範囲をチェックする条件の作成に関する質問については...
それは、仕様の解釈、テーブルの列のデータ型(DATEまたはDATETIME)、および使用可能なデータ...返されるデータに依存します。
要約すると、一般的なアプローチは、日付/日付時刻範囲の「開始」とその範囲の「終了」を特定し、クエリでそれらを参照することです。簡単に考えてみましょう...「昨日」のすべての行。
列がDATE型の場合。式をクエリに組み込む前に、単純なSELECTでテストできます
SELECT DATE(NOW()) + INTERVAL -1 DAY
返された結果が予想どおりであることを確認します。次に、同じ式をWHERE句で使用して、次のようにDATE列と比較できます。
WHERE datecol = DATE(NOW()) + INTERVAL -1 DAY
DATETIMEまたはTIMESTAMP列の場合、>=
および<
不等式比較を使用して範囲を指定できます
WHERE datetimecol >= DATE(NOW()) + INTERVAL -1 DAY
AND datetimecol < DATE(NOW()) + INTERVAL 0 DAY
「最後の7日間」については、それがこの時点から7日間遡って意味するかどうかを知る必要があります。比較の時間コンポーネントを含む最後の7 * 24時間、...
WHERE datetimecol >= NOW() + INTERVAL -7 DAY
AND datetimecol < NOW() + INTERVAL 0 DAY
今日を除く最後の7日間
WHERE datetimecol >= DATE(NOW()) + INTERVAL -7 DAY
AND datetimecol < DATE(NOW()) + INTERVAL 0 DAY
または過去6日間と今日まで...
WHERE datetimecol >= DATE(NOW()) + INTERVAL -6 DAY
AND datetimecol < NOW() + INTERVAL 0 DAY
SELECTステートメントの右側の式をテストすることをお勧めします。NOW()の代わりにユーザー定義変数を使用して、NOW()が返すものに縛られることなく、週/月間で境界をテストできます。 /年の境界など。
SET @clock = '2017-11-17 11:47:47' ;
SELECT DATE(@clock)
, DATE(@clock) + INTERVAL -7 DAY
, @clock + INTERVAL -6 DAY
特定のユースケースの「開始」と「終了」で機能する値を返す式(「最後の7日間」という意味)を取得したら、それらの式をWHERE句の範囲比較で使用できます。
(一部の開発者は、DATE_ADD
構文の代わりにDATE_SUB
および+ INTERVAL val DAY/HOUR/MINUTE/MONTH/YEAR
関数を使用することを好みます。
また、MySQLには、DATE、DATETIME、およびTIMESTAMPデータ型を操作するための便利な関数がいくつか用意されています。DATE、LAST_DAY、
一部の開発者は、他のコードで開始と終了を計算し、SQLクエリに文字列リテラルを指定して、データベースに送信されるクエリが
WHERE datetimecol >= '2017-11-10 00:00'
AND datetimecol < '2017-11-17 00:00'
そして、そのアプローチも機能します。 (私の好みは、CAST、CONVERT、または+ INTERVALトリックを使用して、これらの文字列リテラルをDATETIMEに明示的にキャストすることです...
WHERE datetimecol >= '2017-11-10 00:00' + INTERVAL 0 SECOND
AND datetimecol < '2017-11-17 00:00' + INTERVAL 0 SECOND
上記はすべて、適切なDATE、DATETIMEおよび/またはTIMESTAMPデータ型で「日付」を保存し、さまざまな形式の文字列として保存しないことを前提としています。 'dd/mm/yyyy'
、m/d/yyyy
、ジュリアン日付、散発的に非正規の形式、またはエポックの開始からの秒数として、この答えはもっと長くする必要があります。
INNER JOINを使用しているので、次のようにWHERE句に条件を入れるだけです。
SELECT
p1.kArtikel,
p1.cName,
p1.cKurzBeschreibung,
p1.dLetzteAktualisierung,
p1.dErstellt,
p1.cSeo,
p2.kartikelpict,
p2.nNr,
p2.cPfad
FROM
tartikel AS p1 INNER JOIN tartikelpict AS p2
ON p1.kArtikel = p2.kArtikel
WHERE
DATE(dErstellt) > (NOW() - INTERVAL 7 DAY)
AND p2.nNr = 1
ORDER BY
p1.kArtikel DESC
LIMIT
100;