2016-09-13 12 views
0

userLogTableからすべてのアイテムを選択します。最新の一致するアイテムはactivityTableです。私は単一のクエリでこれをやりたいDBからのアイテムを別のテーブルの最新の日付と比較する

現在、あるテーブルから選択し、別のテーブルと照合しながら結果をループします。

SELECT COUNT(*) AS Visits, userLogTable.* FROM userLogTable GROUP BY Name, Date 

userLogTable 
Name | Surname | Date 
----------------------------- 
Dave | Smith | 2016-06-01 
Jane | Doe  | 2016-06-01 
Dave | Smith | 2016-06-02 
Dave | Smith | 2016-06-01 
Jane | Doe  | 2016-06-03 
Peter | Bloggs | 2016-06-03 
Steve | Foo  | 2016-06-01 
Steve | Foo  | 2016-06-01 
// many more rows 

// above SQL returns the following result as expected/needed 
Name | Surname | Date  | Visits 
---------------------------------------- 
Dave | Smith | 2016-06-01 | 2 
Jane | Doe  | 2016-06-01 | 1 
Dave | Smith | 2016-06-02 | 1 
Jane | Doe  | 2016-06-03 | 1 
Peter | Bloggs | 2016-06-03 | 1 
Steve | Foo  | 2016-06-01 | 2 

activityTable 
Name | Surname | Date 
------------------------------ 
Dave | Smith | 2016-06-03 
Dave | Smith | 2016-06-03 
Dave | Smith | 2016-06-03 
Dave | Smith | 2016-06-02 
Dave | Smith | 2016-06-02 
Dave | Smith | 2016-06-02 
Dave | Smith | 2016-06-01 
Dave | Smith | 2016-05-29 
Dave | Smith | 2016-05-29 
// many more rows 

QUERY:

foreach($userLogTableResult as $key => $val) { 
    // db function 
    SELECT Date 
    FROM activityTable 
    WHERE Date > $latestDateFromUserLogTable 
     AND NAME = $val['Name'] 
     AND Surname = $val['Surname'] 
    ORDER BY Date DESC LIMIT 1 
    // if there is a result then unset this item as it's older than the latest activity 
} 

任意の助けいただければ幸いです。

このコードは、この例では大幅に簡略化されています。私はSQLを構築し、カスタムPDO関数に解析しています。それに応じてすべての値がエスケープされ、サニタイズされます。

+0

新しいまたは同じ日付? 'Dave |スミス| 2016年06月1日 '新しいだけ1であり、あなたの結果は2と表示されます....そして、どのような'一致するアイテム ''私はどんな 'IDを参照していません –

+0

' userLogTable'は 'activityTable'より新しいレコードである必要があります。私のSQLの例は日付で制限されていない、それはすべてを引き出している。私のPHPループは、その後、必要な場所を削除します。私はPHPループの出力を投稿していません。 –

+0

http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-クエリ – Strawberry

答えて

0

私はこれが何をしたいんだと思う:

select ult.* 
from userLogTable ult 
where ult.date > (select max(a.date) 
        from activityTable a 
        where a.name = ult.name and a.surname = ult.surname 
       ) ; 
+0

ありがとう、ちょうどこれをテストしてください。 'activityTable'にレコードが見つからない場合の結果は? 'ult.date'が' NULL'値よりも大きいと考えますか?私の経験のNULL値と比較すると、時々予期しない結果が出ました:/ –

+0

あなたは賢いです、これは完璧に動作します - ありがとうございます。 –

+0

@steve。 。 。アクティビティが見つからない場合、サブクエリはNULLを返し、行はフィルタにかけられます。 –

関連する問題