2017-01-04 6 views
0

このクエリでは、列s.work_id = 14681の最新の行を見つけ、1行だけが表示されます。最新の行が2週以上経過している場合にデータを返します

私の質問は、最新の行が2週間以上経過していることを確認するにはどうすればいいですか? work_status表の各行には、datetime形式のdate_addedがあります。最新の行が2週間以上経過している場合は、それが表示されます。

私の現在のクエリ:

SELECT s.* 
FROM work_status s 
LEFT JOIN work w ON (s.work_id = w.id) 
WHERE s.work_id = 14681 
    AND w.investigation = '1' 
    AND w.deleted = '0' 
    AND w.investigation_winner = '0' 
    AND w.investigation_validated = '1' 
    AND w.work_denied = '0' 
ORDER BY s.date_added DESC 
LIMIT 1 

例データ: Attached

今のクエリは、最初の行を表示しますが、言ったように、最新の行が2を超えていないので、それが何を返すべきではありません週齢。 Query returns first row

+0

LEFT JOINまたはINNER JOINをしますか? – jarlh

+0

WHERE句に正しい表の条件があるので、すでにINNER JOIN結果が得られています。サンプル表のデータと予想される結果を追加します。 (フォーマットされたテキストでもあります) – jarlh

+0

問題は再現可能であるように、ここで働くFiddleを追加する必要があります(現在はありません)。 –

答えて

0

WHERE句に条件を追加して、追加された日付が2週間以上あることを確認できます。

SELECT s.* 
FROM work_status s 
LEFT JOIN work w 
    ON s.work_id = w.id 
WHERE s.work_id = 14681 AND 
     w.investigation = '1' AND 
     w.deleted = '0' AND 
     w.investigation_winner = '0' AND 
     w.investigation_validated = '1' AND 
     w.work_denied = '0' AND 
     s.date_added < DATE_SUB(CURDATE(), INTERVAL 2 WEEK) AND 
     (SELECT MAX(date_added) FROM work_status) < DATE_SUB(CURDATE(), INTERVAL 2 WEEK) 
ORDER BY s.date_added DESC 
LIMIT 1 
+0

それは私が設定した条件を満たしていません。あなたが書いたクエリは、IDが5583の行を返します。しかし、ID 5628は最新の行であり、日付は2週間以上経過していません。 :) –

+0

@SandroOsmanerne私は同意しない。 2週間以上経過していないレコードがない場合、クエリは何も返されません。 –

+0

私はそれをテストしました:https://postimg.org/image/kelnuo3h9/ –

0

ことティムのソリューション@の構築、行うことができます:私は見つける

SELECT s.* 
FROM work_status s 
LEFT JOIN work w 
    ON s.work_id = w.id 
WHERE s.work_id = 14681 AND 
    w.investigation = '1' AND 
    w.deleted = '0' AND 
    w.investigation_winner = '0' AND 
    w.investigation_validated = '1' AND 
    w.work_denied = '0' AND 
    CONVERT(VARCHAR(10), s.date_added, 120) <= DATEADD(WEEK, -2, CONVERT(VARCHAR(10), GETDATE(), 120) AND 
    (SELECT MAX(CONVERT(VARCHAR(10), date_added, 120)) FROM work_status) <= DATEADD(WEEK, -2, CONVERT(VARCHAR(10), GETDATE(), 120) 
ORDER BY s.date_added DESC 
LIMIT 1 

、より頻繁にしていないというタイムスタンプが、私は日付変換を使用する理由である、不正確な結果を与えます。 DATEADD機能を使用すると、探している間隔を簡単に選択できます。

また、追加の日が必要な場合は、<とは対照的に、<=を追加しました。

希望します。

関連する問題