私は、ユーザーが一日中行ったアクティビティを入力できるようにする、ややソーシャルネットワークのロギングプロジェクトを持っています。
私のデータベースには、次のフィールドを持つ「ログ」テーブルがあります。
| log_id | log_content | log_date | log_author |
私の問題は、最初の n 日間をフェッチし、その結果を次のようなグリッド ビューに表示するクエリを実行するにはどうすればよいかということです。
| Monday, December 7, 2013
| log_content, log_author, 6 AM | log_content, log_author, 8:30 AM | ...|
| Tuesday, December 8, 2013
| log_content, log_author, 7:10 AM | log_content, log_author, 12:00 NN | log...|
| Wednesday, December 9, 2013
| log_content, log_author, 6:30 PM |
| Thursday, December 10, 2013
| log_content, log_author, 9:53 AM | log_content, log_author, 4:02 PM | ...|
| Friday, December 11, 2013
| log_content, log_author, 1:34 PM |
ログが大きくなるとボトルネックが発生するため、「ログ」テーブル全体に対してクエリを実行できないことはわかっています。私はビット単位でクエリを実行することを考えていました.ユーザーが下にスクロールすると、次のデータセットを表示するために別のバックグラウンドクエリが実行されます(制限とオフセットを使用)。
現時点での私のクエリは次のようになります。
function fetch_logs($group_id, $limit, $offset){
$this->db->select('l.log_id, l.log_date, l.log_content, u.username');
$this->db->from('logs AS l');
$this->db->join('log_group_ref AS r', 'l.log_id = r.log_id');
$this->db->join('users AS u', 'l.log_author = u.user_id');
$this->db->where('r.group_id', $group_id);
$this->db->limit($limit, $offset);
return $this->db->get()->result_array();
}
しかし、クエリされたデータを日ごとにグループ化してグリッドに配置する方法がわかりません。
私はグリッドで Twitter の Bootstrap を使用しているので、各ログをうまくグリッドに配置し、さらにログがある場合はスクロール バーを追加するだけです。
アップデート:
そこで、ラヒール シャンの 2 番目の方法に基づいてコードを更新しましたが、追加するまで必要なデータを取得できないようです。
$this->db->group_by(l.log_date);
raheel shan のものと同じようにフォーマットされていませんが、正しいデータセットを取得する Exander のコードに基づいています。
これら2つのうち、更新されたクエリは次のとおりです。
$select = array(
"DATE_FORMAT(l.log_date,'%a , %b %d , %Y') AS LogDate",
"GROUP_CONCAT(l.log_id) AS LogIDs",
"GROUP_CONCAT(l.log_content) AS LogContents",
"GROUP_CONCAT(u.username) AS LogAuthors",
"GROUP_CONCAT(DATE_FORMAT(l.log_date,'%h:%i %p')) AS LogTimes"
);
$this->db->select($select);
$this->db->from('logs AS l');
$this->db->join('log_group_ref AS r', 'l.log_id = r.log_id');
$this->db->join('users AS u', 'l.log_author = u.user_id');
$this->db->where('r.group_id', $group_id);
$this->db->group_by('l.log_date');
$this->db->limit($limit, $offset);
return $this->db->get()->result_array();
ここで、各 LogContents、LogAuthors、LogTimes を分解し、それらを配列にグループ化する必要があります。ラヒール・シャンのコードをもう一度勉強する必要があります。
更新:これを達成するために必要なものをすべて手に入れました。私は 1 つしか受け入れることができないので、raheel shan のものを受け入れ済みとしてマークします。Exander's も正しい上にコードが少ないため、優れています。