2012-04-12 12 views
3

私がやっていることは、mysqlデータベースの更新テーブルからPHPを使ってエントリを取得することです。各エントリには、タイムスタンプが添付されています。最初に、タイムスタンプから10個の異なる日付を取得し、10個のユニークな日付を使用して新しい配列を作成します(fetchAllは日付を多次元配列に入れているため、これを行います)。これは10以上のエントリを返すことができます。 10個の別々のタイムスタンプではなく、10個の別個の日付が必要です。例えばMySQLは別の日付で制限付きで、日付は制限付きですが、エントリはありません

2012-03-25が異なる日付から最初の呼び出しに現れた場合、それは見つけることができる:

2012-03-25 00:58:53 
2012-03-25 00:58:02 
2012-03-25 00:57:20 
2012-03-25 00:56:35 
2012-03-25 00:55:58 
2012-03-25 00:53:20 
2012-03-25 00:52:32 
2012-03-25 00:51:45 

タイムスタンプが異なるため。

ここに私が使用している現在のコードがあります。

$test = $dbh->getArray("SELECT DISTINCT DATE_FORMAT(added, '%Y-%m-%d') AS added FROM db_updates ORDER BY added DESC LIMIT 0,10"); 

foreach ($test as $entry) { 
    list($date) = $entry; 
    $output[] = '\''.$date.'\''; 
} 

$test2 = $dbh->getArray("SELECT * FROM db_updates WHERE DATE_FORMAT(added, '%Y-%m-%d') IN (".implode(',', $output).") ORDER BY added DESC"); 

print_r($test2); 

これは33の結果を返しました。

誰かが尋ねる場合は、PHPでmysql関数ではなくPDOを使用しています。そのコードはここにあります:

public function getArray($query) { 
    $result = $this->db->query("$query"); 
    return $result->fetchAll(PDO::FETCH_NUM); 
} 

これはすべて100%動作し、私がしたいことをします。しかし、私の質問は、これをすべて単一のmysql呼び出しで行う方法があるため、中間でループを2回呼び出す必要はありません。

ジョイントなどを使ってGoogleを検索し、試行錯誤して自分自身を見つけ出そうとしました。

答えて

3

それはINNER JOINで動作するはずですし、あなただけのDATETIME値の時刻部分を取り除くためにDATE(added)の代わりDATE_FORMAT()を使用することができます。

SELECT * 
FROM 
    db_updates 
    INNER JOIN (
    /* Subquery returns most recent 10 dates */ 
    SELECT DISTINCT DATE(added) AS added FROM db_updates ORDER BY added DESC LIMIT 0,10 
    /* JOIN between dates */ 
) datelist ON DATE(db_updates.added) = datelist.added 
ORDER BY db_updates.added DESC 
+0

パーフェクト。ありがとう:)私は答えとしてこれを受け入れることができる前に7分以上待つ必要があります。 – WMI

関連する問題