3

私がやろうとしているのは、phpを使用してmysqlデータベースの更新テーブルからエントリを取得することです。各エントリにはタイムスタンプが添付されています。まず、タイムスタンプから10個の異なる日付を取得し、それらの10個の一意の日付を使用して新しい配列を作成し(fetchAllが日付を多次元配列に配置するためこれを行います)、次に、それらの日付を持つすべてのエントリを取得する別のデータベース呼び出しを実行します。10を超えるエントリを返すことができます。10個の異なるタイムスタンプではなく、10個の異なる日付を設定したいと思います。

たとえば、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%動作し、私がやりたいことを実行します。ただし、私の質問は、1回のmysql呼び出しでこれらすべてを実行する方法があるかどうかです。したがって、途中でループを使用して2回呼び出す必要はありません。

グーグルを検索して自分で理解しようとしたが、結合などを使った試行錯誤は役に立たなかった。

4

1 に答える 1

3

で動作するはずです。代わりに、DATETIME値の時間部分を削除するためにINNER JOIN使用できます。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
于 2012-04-12T02:18:26.623 に答える